diff --git a/.gitignore b/.gitignore index 69076e4..53c467f 100644 --- a/.gitignore +++ b/.gitignore @@ -53,8 +53,7 @@ Carthage/Build # Note: if you ignore the Pods directory, make sure to uncomment # `pod install` in .travis.yml # -# Pods/ -======= +Pods/ ## Obj-C/Swift specific *.hmap @@ -73,7 +72,7 @@ playground.xcworkspace # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. # Packages/ # Package.pins -# Package.resolved +Package.resolved # *.xcodeproj # # Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata @@ -88,7 +87,7 @@ playground.xcworkspace # you should judge for yourself, the pros and cons are mentioned at: # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control # -# Pods/ +Pods/ # # Add this line if you want to avoid checking in source code from the Xcode workspace # *.xcworkspace diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 1989e4e..93fe270 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -55,8 +55,7 @@ further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at badrinathvm@gmail.com. All -complaints will be reviewed and investigated and will result in a response that +reported by raising a GitHub issue. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. diff --git a/Example/Podfile b/Example/Podfile index b34f8b5..5890853 100644 --- a/Example/Podfile +++ b/Example/Podfile @@ -4,6 +4,7 @@ use_frameworks! #inhibit_all_warnings! target 'StepperView_Example' do + platform :ios, '13.0' pod 'StepperView', :path => '../' target 'StepperView_Tests' do @@ -12,11 +13,12 @@ target 'StepperView_Example' do end end - target 'StepperView_Watch' do + platform :watchos, '7.0' pod 'StepperView', :path => '../' end target 'StepperView_Watch Extension' do + platform :watchos, '7.0' pod 'StepperView', :path => '../' end diff --git a/Example/Podfile.lock b/Example/Podfile.lock index d5be782..48c62e1 100644 --- a/Example/Podfile.lock +++ b/Example/Podfile.lock @@ -1,6 +1,8 @@ PODS: - SnapshotTesting (1.7.2) - - StepperView (1.5.6) + - StepperView (1.6.7): + - Yams (~> 5.0) + - Yams (5.0.6) DEPENDENCIES: - SnapshotTesting (~> 1.7.2) @@ -9,6 +11,7 @@ DEPENDENCIES: SPEC REPOS: trunk: - SnapshotTesting + - Yams EXTERNAL SOURCES: StepperView: @@ -16,8 +19,9 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: SnapshotTesting: 8caa6661fea7c8019d5b46de77c16bab99c36c5c - StepperView: d21adb48db4689804dddd2f2e436447ffe97e3c0 + StepperView: d219080b67f1155092edd3e53426e1a901380d4a + Yams: e10dae147f517ed57ecae37c5e8681bdf8fcab65 -PODFILE CHECKSUM: 8b713604471a4b42c3cfe96f708359ac25857036 +PODFILE CHECKSUM: 12a462c329ec024e6417eb3d5f3c0c7710458fc2 -COCOAPODS: 1.10.1 +COCOAPODS: 1.15.0 diff --git a/Example/Pods/Local Podspecs/StepperView.podspec.json b/Example/Pods/Local Podspecs/StepperView.podspec.json deleted file mode 100644 index c9b6864..0000000 --- a/Example/Pods/Local Podspecs/StepperView.podspec.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "StepperView", - "version": "1.5.6", - "swift_versions": "5.0", - "summary": "SwiftUI iOS component for Step Indications.", - "description": "Stepper View Indication componet for SwiftUI", - "homepage": "https://github.com/badrinathvm/StepperView", - "license": { - "type": "MIT", - "file": "LICENSE" - }, - "authors": { - "badrinathvm": "badrinathvm@gmail.com" - }, - "source": { - "git": "https://github.com/badrinathvm/StepperView.git", - "tag": "1.5.6" - }, - "social_media_url": "https://twitter.com/badrivm", - "platforms": { - "ios": "11.0", - "watchos": "6.0" - }, - "source_files": "Sources/**/*.swift", - "swift_version": "5.0" -} diff --git a/Example/Pods/Manifest.lock b/Example/Pods/Manifest.lock deleted file mode 100644 index d5be782..0000000 --- a/Example/Pods/Manifest.lock +++ /dev/null @@ -1,23 +0,0 @@ -PODS: - - SnapshotTesting (1.7.2) - - StepperView (1.5.6) - -DEPENDENCIES: - - SnapshotTesting (~> 1.7.2) - - StepperView (from `../`) - -SPEC REPOS: - trunk: - - SnapshotTesting - -EXTERNAL SOURCES: - StepperView: - :path: "../" - -SPEC CHECKSUMS: - SnapshotTesting: 8caa6661fea7c8019d5b46de77c16bab99c36c5c - StepperView: d21adb48db4689804dddd2f2e436447ffe97e3c0 - -PODFILE CHECKSUM: 8b713604471a4b42c3cfe96f708359ac25857036 - -COCOAPODS: 1.10.1 diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj deleted file mode 100644 index 70b0160..0000000 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ /dev/null @@ -1,2015 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 01757E29DF92738C1D5D0528F1EB4824 /* View.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3912642063EA0830CFF13B31BF711D13 /* View.swift */; }; - 01EAFFC57329D2A990A377903960DFD1 /* View+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F7BA3A8661BBC806864F697C51D7318 /* View+Extensions.swift */; }; - 079B606CEAB9EE6D54A72C1C3FB4C21D /* StepperView-iOS-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A0B0363C5DA0646CFB2B3EF46BE0F078 /* StepperView-iOS-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1141CE5550EE2FB872C3323A2BE2426F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3443D522D1F9EC9954ECAFA5CCDABBE6 /* Foundation.framework */; }; - 11F2134521037184F745C9010217B501 /* Description.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9321EEBF8992813520D43041AF4164EA /* Description.swift */; }; - 14CC16A84D0558FF9DC6927E1BA82F02 /* Any.swift in Sources */ = {isa = PBXBuildFile; fileRef = DE5CB9BA70CE2A0FB3E198A4FB9A5437 /* Any.swift */; }; - 18ED84EFAF015095FCCF61A8E494F325 /* AssertSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51DFDE88834F7E40014E803B6B644499 /* AssertSnapshot.swift */; }; - 1A1F20E176923FF03A0EAEA886703719 /* NSView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D34051EC87A66DF65C7B3D8627594429 /* NSView.swift */; }; - 1A4448B14C94D38D7E0645F23C6C9C5C /* Pods-StepperView_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2A7C6F0E5A7E5F2F3E4BA214F0586F85 /* Pods-StepperView_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 21E74A56ED4F23FC9F7AF3BE88BB6E84 /* CircledIconView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE6DC4328B6C07C936F0EFF50DBE3257 /* CircledIconView.swift */; }; - 2371CFDF095282B1D6935C36C81E46FC /* UIImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A0D19BF7BAEB7DA2481EF41D28AFEFD /* UIImage.swift */; }; - 23B3D1B39D273F7B43BA45F255EDE5C5 /* CaseIterable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F974148746ADF47725F16E8AE8D554F /* CaseIterable.swift */; }; - 25FB3C2B4670C1CA6F5574947BECE595 /* HorizontalLineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD0367335418A9475527400CB190FA8B /* HorizontalLineView.swift */; }; - 28F64C016F8AA890227ED7CCE698C69D /* PreferenceKey+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 979CD95CCB2851EA30B74C797FB103B9 /* PreferenceKey+Extension.swift */; }; - 29F37DB8A1899894CA87E8E8381E2C11 /* NSViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA9C38ACEC8EF6779198630A964BC9E8 /* NSViewController.swift */; }; - 33432CD4B8F83F0C678B5C67CAF13414 /* String+SpecialCharacters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 24B910A7CADF2217BFBFDB9C98EC114A /* String+SpecialCharacters.swift */; }; - 3D2859086A3653805783B3EE9F879664 /* Pods-StepperView_Watch Extension-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 4E753134DBAC9E58D31D4D4950BA6E89 /* Pods-StepperView_Watch Extension-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 41260DEE55CBAF16B3A15CFBDFCB3AAE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C55B0DE246DBF20E0B9D89FBD905F48 /* Foundation.framework */; }; - 440314FEC8EC90F865D8D20910989A69 /* Diffing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09FD26E8685603ED773645E9748DE892 /* Diffing.swift */; }; - 4489D243110E804DD140DC4E51ADB764 /* HorizontalLineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD0367335418A9475527400CB190FA8B /* HorizontalLineView.swift */; }; - 45CA33196B9B2E32EBC05C1D89745ABE /* Colors+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDE7A9925C1CAC9A9869C3C58582C9EB /* Colors+Extension.swift */; }; - 46B2A4686C72C29C24576FC6FF56A7BE /* AssertInlineSnapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = DF19BCC9495D48049049450AADB9A50C /* AssertInlineSnapshot.swift */; }; - 4BE5BCCB3A39A09E538390A7F1972848 /* Pods-StepperView_Watch Extension-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7FA6DA9948C40DFA0B1A3AC3BBBDE7E5 /* Pods-StepperView_Watch Extension-dummy.m */; }; - 4C1EABA32EF0C7ED0D0AFD0D7F11DBB9 /* StepIndicatorHorizontalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 037A5F0BAD04B43C7E47A3A4B16A6604 /* StepIndicatorHorizontalView.swift */; }; - 4E5AA162D02372A80FABE033AD6BFFE6 /* Diff.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8552C0F4E4AF5BB803C0393CE438BA28 /* Diff.swift */; }; - 4F03BBCA0FCF5903B46F72BE0BADDF34 /* SceneKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4C0CA527311E8D6053CD18C45F669B32 /* SceneKit.swift */; }; - 509FAAD85506B9E1BCCA50505B8C93DB /* SpriteKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = C213B490DAAF188ECBD5D1BF7BC777E6 /* SpriteKit.swift */; }; - 52D653F555B9F1C7FC3C64225385AB49 /* Pods-StepperView_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B7F4DA1477939461442D642761C8158E /* Pods-StepperView_Example-dummy.m */; }; - 5396DD33A8FBCFC2417D455B6189A5EC /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C55B0DE246DBF20E0B9D89FBD905F48 /* Foundation.framework */; }; - 5676F834482B032FB80B1D4A65906581 /* PitStopLineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA3F145C60CFFB10F1798BB55725230F /* PitStopLineView.swift */; }; - 56B2D76BD27EAA69A1BED0113B7F9F51 /* UIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 444F03C0C7E948C8C4716A1692A121F3 /* UIView.swift */; }; - 57244463125C60529B7391F9FA3052AD /* Snapshotting.swift in Sources */ = {isa = PBXBuildFile; fileRef = A86F0DD6C92051D8A83077FC4673DDC2 /* Snapshotting.swift */; }; - 59B68A9EDFFBFF6492AFFD82374857C5 /* Pods-StepperView_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 55C34891961FC441E1A021D5CE301AB7 /* Pods-StepperView_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5AE04565525B28FB2A47DBA747A066FE /* CircledIconView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE6DC4328B6C07C936F0EFF50DBE3257 /* CircledIconView.swift */; }; - 6658F9FE5EEFD579907F946DD9FDD8E3 /* URLRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6A3274FB1B6B5844F8D1A124BE5B0EE /* URLRequest.swift */; }; - 67C39A754A360A5EFC7FE0037CECE5C3 /* CALayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD10704D670BE755E3C1A04C482F14BB /* CALayer.swift */; }; - 6E1925DDCD0C3929ED558F7198788B2B /* VerticalAlignment+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FA8B71659D7F0DA0B54A1914619FC27 /* VerticalAlignment+Extension.swift */; }; - 6E6BFA34D92DE75FF0A1F7B2375FDE7B /* PitStopLineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA3F145C60CFFB10F1798BB55725230F /* PitStopLineView.swift */; }; - 6EACA4857F2C86A910F9AC60587B8C5E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3443D522D1F9EC9954ECAFA5CCDABBE6 /* Foundation.framework */; }; - 6FECEB02C121C70F0952E69020456077 /* StepperView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30808D73138CABEBE9E3BA4D4D205110 /* StepperView.swift */; }; - 73F64D790A6E3DE84E5AA93667008A63 /* EnvironmentValues+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = B01D516C6763F1B1F43B3A6786891218 /* EnvironmentValues+Extension.swift */; }; - 7678DA5431588316E3EBC82767FD8F4E /* VerticalAlignment+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FA8B71659D7F0DA0B54A1914619FC27 /* VerticalAlignment+Extension.swift */; }; - 772CC8FA4E8C3EE5230F2E9145A1F018 /* TextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E4B08FC986AC2CA988DA70A194536E6 /* TextView.swift */; }; - 795BD6F360D43281D50C9C50F5B88CAC /* StepperView-iOS-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BF2156748749E12039E5059B4E61A07C /* StepperView-iOS-dummy.m */; }; - 7A0DA974654D5A3FE765204467940805 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3443D522D1F9EC9954ECAFA5CCDABBE6 /* Foundation.framework */; }; - 7F62B87D80190474F059EF98599B172C /* StepIndicatorHorizontalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 037A5F0BAD04B43C7E47A3A4B16A6604 /* StepIndicatorHorizontalView.swift */; }; - 8003323F07F7A6F822902979CE092B88 /* Wait.swift in Sources */ = {isa = PBXBuildFile; fileRef = B85F63F6F0616F7FE7949F7EE63BD175 /* Wait.swift */; }; - 84432746DEB076256002FB7BABDAAAA5 /* SnapshotTesting-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = FE54E0EE77832C01DC96FA42213EFA34 /* SnapshotTesting-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 87C838CFDD1157225A54C7C23D7B812A /* StepperView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 30808D73138CABEBE9E3BA4D4D205110 /* StepperView.swift */; }; - 8B8A6A8258EFF349E0B25790AA7E6E70 /* Colors+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDE7A9925C1CAC9A9869C3C58582C9EB /* Colors+Extension.swift */; }; - 8CD5CB3FDF05526DBF034B61F696BA93 /* PlistEncoder.swift in Sources */ = {isa = PBXBuildFile; fileRef = EB353159037433B43D06771A808670A2 /* PlistEncoder.swift */; }; - 8E1FBD13A74F689CFC06054841BFC596 /* UIViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A786374E297AD3E72EF898FE0FE8DC2A /* UIViewController.swift */; }; - 8E5CA5266FE64ADD3EACE402B99AD43F /* StepperView-watchOS-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = AB81E8D19ECE99E242B3BF7394A5F463 /* StepperView-watchOS-dummy.m */; }; - 94B3960AAECDFF0856E0301C370C9EE6 /* LoadingTimer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AA10EBD32FE9876D6FEBA0DB784C008 /* LoadingTimer.swift */; }; - 977C39038CBE4E53BE92B975EAAE55BC /* StepIndicatorVerticalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0121FF4CEF26054F53A0AB4A72B5A077 /* StepIndicatorVerticalView.swift */; }; - 9800EFBFE483CD9E6471C03435320076 /* StepperView-watchOS-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 9AAEFAA81F1961E13F3499FB65E26481 /* StepperView-watchOS-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9AA06A732423614C1594CDAE07C6B6D0 /* TextView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E4B08FC986AC2CA988DA70A194536E6 /* TextView.swift */; }; - 9AFD35BFCAB02350ABB8761DCA6F6ED9 /* LoadingTimer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AA10EBD32FE9876D6FEBA0DB784C008 /* LoadingTimer.swift */; }; - A39A5E1BB80978C9AC68610A04E56545 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3443D522D1F9EC9954ECAFA5CCDABBE6 /* Foundation.framework */; }; - A455E5B77A019CEAEEA0F9D26B1B74E6 /* Codable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 677F639EA9C06D0891A723A57418F598 /* Codable.swift */; }; - A8C3F883A619481C44145C3BAA9E3B81 /* EnvironmentValues+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = B01D516C6763F1B1F43B3A6786891218 /* EnvironmentValues+Extension.swift */; }; - AA6612CD34134596239652A299AC0F76 /* Async.swift in Sources */ = {isa = PBXBuildFile; fileRef = F8C5BFB2709ACA3DB976330C93F0F0B0 /* Async.swift */; }; - ACD1023635AD860C09E6F90B54F21EAE /* View+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F7BA3A8661BBC806864F697C51D7318 /* View+Extensions.swift */; }; - AF0A952BC098616D0239E09CD43A0A88 /* PreferenceKey+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 979CD95CCB2851EA30B74C797FB103B9 /* PreferenceKey+Extension.swift */; }; - AFEA48DB6BBE208C407FB0C4C59F49A8 /* IndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A9A6F1EB1C5C48EA26D5D7726F6D56B /* IndicatorView.swift */; }; - B04C2EA06B68C1B65396463AD6F616F2 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1F617EBF85EEBCCF34FE1E1B42A8784 /* Utils.swift */; }; - B04CA17471143BEDA50779BE9660BD2A /* SnapshotTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = D1EDA2CFF4FC644BF0BA1960AF77E401 /* SnapshotTestCase.swift */; }; - B551120ADB2A47593DB465CB7AB87459 /* PitStopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 916AFA1F3CEADA5123AF42341C9C9E74 /* PitStopView.swift */; }; - B55C1A68F67B9586B4719651D1CDD722 /* VerticalLineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 230EA4B54F18F7F7B03EFA6DB15A64B4 /* VerticalLineView.swift */; }; - BCF7F0E6DDD930788B549D7C8E63EFE8 /* Pods-StepperView_Watch-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 3DB364750AEF9F684ED1A0611680B9F3 /* Pods-StepperView_Watch-dummy.m */; }; - BDFAF00F9FE360EAFD864F290030A2D0 /* Data.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4BB757B0C569052CF1DBEC733FFD737 /* Data.swift */; }; - BE068F001E2344449F6E193DFB12B1D1 /* NSImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF4286727440DD327DE2AE95BF9D44E0 /* NSImage.swift */; }; - C2B818BE2E57EF9A8CE51775FCB33C2B /* Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BF05570F4FC5530B25624B36D5BBC7F /* Internal.swift */; }; - C9E62123C70242796F6965C67FFD0605 /* PitStopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 916AFA1F3CEADA5123AF42341C9C9E74 /* PitStopView.swift */; }; - D27A05C330322B61C35FFA59583FC02B /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1F617EBF85EEBCCF34FE1E1B42A8784 /* Utils.swift */; }; - D56563764E24224FB95BC77EC18F7D9E /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = 584C27168F70A918E4F29362FCBCFF00 /* String.swift */; }; - D61CF48A3DEC55CC34637130BBFB48EA /* VerticalLineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 230EA4B54F18F7F7B03EFA6DB15A64B4 /* VerticalLineView.swift */; }; - D6A43851802E3E81CF23D65CA9A81E4E /* SnapshotTesting-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 62D194AF3F49F0CAC373B258FBAD1C78 /* SnapshotTesting-dummy.m */; }; - D72925EA88057F88A8AC3D62F7D8FE88 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C55B0DE246DBF20E0B9D89FBD905F48 /* Foundation.framework */; }; - DC63B1671C8EF376AAAA8F93FB3DE648 /* IndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5A9A6F1EB1C5C48EA26D5D7726F6D56B /* IndicatorView.swift */; }; - E6AAA4D897FFA74C28D27419A600B74B /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95B6E8DD5E9A276F4BBEF4E363D46D6F /* XCTest.framework */; }; - E844B9143166940B1EB3BDA4D2BDD67B /* NumberedCircleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46EC60383B136A874161FB6788E7A566 /* NumberedCircleView.swift */; }; - EDCE614B02A5F7D181391CF81E599117 /* Pods-StepperView_Watch-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = C719024204C3A03223697AF4003AF2E9 /* Pods-StepperView_Watch-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F5C10090D5CC8AABC64DD17E69B56DE6 /* NumberedCircleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46EC60383B136A874161FB6788E7A566 /* NumberedCircleView.swift */; }; - F79F97A1606023C4F2466173282A44E5 /* StepIndicatorVerticalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0121FF4CEF26054F53A0AB4A72B5A077 /* StepIndicatorVerticalView.swift */; }; - F9D908B492555B2CCE640A685FF599BC /* Pods-StepperView_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 61B0368E9352383AFBEDC872B3AA718E /* Pods-StepperView_Tests-dummy.m */; }; - FDAD70506FFFD578C1327E64876A08E3 /* XCTAttachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 410FC8A7EC948E73AC72E902BE6E37E3 /* XCTAttachment.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 5AA9A90CA687129DBA01336F2483462B /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = E5C4FE1324F54F73C9F9F6B19D0A98B7; - remoteInfo = "StepperView-watchOS"; - }; - 77E964D150AA101D4C22BE9A244CCA0E /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = DBF79473512C18725EF567DC3C660B7D; - remoteInfo = "Pods-StepperView_Example"; - }; - 84F74D010F1D281A2C1E2A3B64EDFEB6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = ADEAE7CDD604DE4F3072E6021A314487; - remoteInfo = SnapshotTesting; - }; - C147C98286565B5F847EF55CE1B39A36 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = E5C4FE1324F54F73C9F9F6B19D0A98B7; - remoteInfo = "StepperView-watchOS"; - }; - FCCB94B9641D2BAAF9328F29E5E4717D /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 3AA859A35A1114B15E4CC867026B10D2; - remoteInfo = "StepperView-iOS"; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 010815BC1D58FF43EC5F2FA2A7AE865D /* jazzy.css */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.css; name = jazzy.css; path = docs/css/jazzy.css; sourceTree = ""; }; - 0121FF4CEF26054F53A0AB4A72B5A077 /* StepIndicatorVerticalView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = StepIndicatorVerticalView.swift; sourceTree = ""; }; - 02139E7D45839154693C7CF56620BD04 /* SpacingKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = SpacingKey.html; path = docs/Structs/SpacingKey.html; sourceTree = ""; }; - 02F0A58382FFD9E26C50F1199AFC54EE /* carat.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = carat.png; path = docs/img/carat.png; sourceTree = ""; }; - 031AF3F2601DAF333EE3F48174BE3021 /* spinner.gif */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.gif; name = spinner.gif; path = docs/img/spinner.gif; sourceTree = ""; }; - 037A5F0BAD04B43C7E47A3A4B16A6604 /* StepIndicatorHorizontalView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = StepIndicatorHorizontalView.swift; sourceTree = ""; }; - 05C028F74B9508FE72717D3BB2BD7B7A /* Pods_StepperView_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_StepperView_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 07480BA37145A61B2F6B485C2EA5A926 /* search.json */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.json; name = search.json; path = docs/search.json; sourceTree = ""; }; - 0906268C0BFB51BB50248062A742EF82 /* StepperView.tgz */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file; name = StepperView.tgz; path = docs/docsets/StepperView.tgz; sourceTree = ""; }; - 09E6CE690A99D6AF18A5C486E2F5ECCB /* StepIndicatorHorizontalView.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = StepIndicatorHorizontalView.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/StepIndicatorHorizontalView.html; sourceTree = ""; }; - 09FD26E8685603ED773645E9748DE892 /* Diffing.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Diffing.swift; path = Sources/SnapshotTesting/Diffing.swift; sourceTree = ""; }; - 0B1AF4EE96053C3B0D8314A16AAA6B2E /* Pods-StepperView_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-StepperView_Tests.release.xcconfig"; sourceTree = ""; }; - 0D55D1033AA5478F71538396CDD100DF /* Pods-StepperView_Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-StepperView_Example-Info.plist"; sourceTree = ""; }; - 10403D102B45E778B1869E6956372AD4 /* PitStopStep.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = PitStopStep.html; path = docs/Structs/PitStopStep.html; sourceTree = ""; }; - 106A1D510429ACDD808BD330FB52E6F3 /* PitStopLineView.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = PitStopLineView.html; path = docs/Structs/PitStopLineView.html; sourceTree = ""; }; - 1253A303ED2B11912261F6EAD3625F1A /* Pods-StepperView_Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-StepperView_Tests-frameworks.sh"; sourceTree = ""; }; - 1667A061847303499F1BF7F638D3B2C2 /* StepperAlignment.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = StepperAlignment.html; path = docs/Enums/StepperAlignment.html; sourceTree = ""; }; - 17AE62194BF923BBA9E316BAEBBABF3E /* CGRectData.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = CGRectData.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/CGRectData.html; sourceTree = ""; }; - 19D794AFA885DAF5937D46F11AB03470 /* Pods-StepperView_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-StepperView_Example-acknowledgements.plist"; sourceTree = ""; }; - 1A0E4BDAF541364B192E37E386588577 /* StepperView-watchOS-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "StepperView-watchOS-prefix.pch"; path = "../StepperView-watchOS/StepperView-watchOS-prefix.pch"; sourceTree = ""; }; - 1A87142BB0463B2330C3E45E356F39B1 /* PitStopOptionsKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = PitStopOptionsKey.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/PitStopOptionsKey.html; sourceTree = ""; }; - 1D977FF5D1206DC3CAFF4E0B4515EA3E /* WidthKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = WidthKey.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/WidthKey.html; sourceTree = ""; }; - 1E1FBE49D989987B3AF4D994A0029CF2 /* Pods-StepperView_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-StepperView_Tests.modulemap"; sourceTree = ""; }; - 1E35132387A01BF6418B815210B677B4 /* StepperView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = StepperView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 1F2E911E0E35A5F125DE1E1EDB4AB79E /* jazzy.css */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.css; name = jazzy.css; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/css/jazzy.css; sourceTree = ""; }; - 1F958D88B1FFB51BEA0BCFA5B9C77AB4 /* LineOptionsKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = LineOptionsKey.html; path = docs/Structs/LineOptionsKey.html; sourceTree = ""; }; - 1FA8B71659D7F0DA0B54A1914619FC27 /* VerticalAlignment+Extension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "VerticalAlignment+Extension.swift"; sourceTree = ""; }; - 2085264E20A9F06194A6BDB219885BE2 /* PitStopView.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = PitStopView.html; path = docs/Structs/PitStopView.html; sourceTree = ""; }; - 21E1920C6987E4D2E534F24A4B041330 /* IndicatorView.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = IndicatorView.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/IndicatorView.html; sourceTree = ""; }; - 21FA315ABE27D7DE0FD7B793A4222387 /* Pods-StepperView_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-StepperView_Tests.debug.xcconfig"; sourceTree = ""; }; - 2278993DA9270E6BB82EB6AB6488F966 /* StepperMode.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = StepperMode.html; path = docs/Enums/StepperMode.html; sourceTree = ""; }; - 230EA4B54F18F7F7B03EFA6DB15A64B4 /* VerticalLineView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = VerticalLineView.swift; sourceTree = ""; }; - 24B910A7CADF2217BFBFDB9C98EC114A /* String+SpecialCharacters.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "String+SpecialCharacters.swift"; path = "Sources/SnapshotTesting/Common/String+SpecialCharacters.swift"; sourceTree = ""; }; - 267DC11E2F9816EF51D2ABC239C0D529 /* RedSubType.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = RedSubType.html; path = docs/Enums/Colors/RedSubType.html; sourceTree = ""; }; - 26A17C151ED51A5E3D49F52961E29232 /* NumberedCircleView.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = NumberedCircleView.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/NumberedCircleView.html; sourceTree = ""; }; - 27E120B581E98313203985771E3647B8 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = Info.plist; path = docs/docsets/StepperView.docset/Contents/Info.plist; sourceTree = ""; }; - 28A73342D042AB46CD0B4A1C1397E7D5 /* badge.svg */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = badge.svg; path = docs/badge.svg; sourceTree = ""; }; - 2A7C6F0E5A7E5F2F3E4BA214F0586F85 /* Pods-StepperView_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-StepperView_Example-umbrella.h"; sourceTree = ""; }; - 2AA10EBD32FE9876D6FEBA0DB784C008 /* LoadingTimer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LoadingTimer.swift; sourceTree = ""; }; - 2E2CA03B708D8424B73A38D4C8C250F5 /* SnapshotTesting.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SnapshotTesting.debug.xcconfig; sourceTree = ""; }; - 2ED85E7A691678A88850C24687E42D66 /* HorizontalLineView.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = HorizontalLineView.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/HorizontalLineView.html; sourceTree = ""; }; - 30808D73138CABEBE9E3BA4D4D205110 /* StepperView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = StepperView.swift; sourceTree = ""; }; - 314A21CD4CA38212B1C9361BB856ED68 /* SnapshotTesting.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SnapshotTesting.release.xcconfig; sourceTree = ""; }; - 32FCE75B30BDD64A48AA9AFBEA1EB8C8 /* index.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = index.html; path = docs/index.html; sourceTree = ""; }; - 3443D522D1F9EC9954ECAFA5CCDABBE6 /* 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; }; - 34A0A3CC14396D2DA1E2D3FD64DEDAED /* SnapshotTesting-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SnapshotTesting-prefix.pch"; sourceTree = ""; }; - 353AACBC0866DF85C19BF4739696B13D /* Pods-StepperView_Watch.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-StepperView_Watch.debug.xcconfig"; sourceTree = ""; }; - 36838DEBAE6E2B39661DBBA32254A4B1 /* IndicatorView.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = IndicatorView.html; path = docs/Structs/IndicatorView.html; sourceTree = ""; }; - 3912642063EA0830CFF13B31BF711D13 /* View.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = View.swift; path = Sources/SnapshotTesting/Common/View.swift; sourceTree = ""; }; - 39303D4D03A8415AD4177C86680F7E3D /* AnimatedCircle.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = AnimatedCircle.html; path = docs/Structs/AnimatedCircle.html; sourceTree = ""; }; - 39389C40BF1E4F29AFA9E00EF4AA7CFA /* Pods-StepperView_Watch-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-StepperView_Watch-frameworks.sh"; sourceTree = ""; }; - 396DB9F8CD8B381D0851541BA7E8885C /* StepperView-iOS-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "StepperView-iOS-prefix.pch"; sourceTree = ""; }; - 3A540063FC9B6D4937073EBE532CA784 /* VerticalLineView.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = VerticalLineView.html; path = docs/Structs/VerticalLineView.html; sourceTree = ""; }; - 3BF08A054DB2EFFB34A02DB28C737D50 /* Pods-StepperView_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-StepperView_Example-acknowledgements.markdown"; sourceTree = ""; }; - 3DB364750AEF9F684ED1A0611680B9F3 /* Pods-StepperView_Watch-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-StepperView_Watch-dummy.m"; sourceTree = ""; }; - 3F67E7AC212DABDF49FEC3651669CA0A /* Pods_StepperView_Watch.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_StepperView_Watch.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 3F94819CBBD0D4391103D2B79A1FFD02 /* GraySubType.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = GraySubType.html; path = docs/Enums/Colors/GraySubType.html; sourceTree = ""; }; - 4037DE289DF081A073997DE7C10F8A8E /* StepperMode.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = StepperMode.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Enums/StepperMode.html; sourceTree = ""; }; - 410FC8A7EC948E73AC72E902BE6E37E3 /* XCTAttachment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = XCTAttachment.swift; path = Sources/SnapshotTesting/Common/XCTAttachment.swift; sourceTree = ""; }; - 4375A694F5270ED1FEE5FD35BAF8BD4E /* Pods-StepperView_Watch Extension-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-StepperView_Watch Extension-acknowledgements.markdown"; sourceTree = ""; }; - 444F03C0C7E948C8C4716A1692A121F3 /* UIView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIView.swift; path = Sources/SnapshotTesting/Snapshotting/UIView.swift; sourceTree = ""; }; - 448E1525949480A6C7A7DB4279B2E907 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; - 44E083363A4248B2AE63427EE12EBE61 /* Pods-StepperView_Watch Extension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-StepperView_Watch Extension.release.xcconfig"; sourceTree = ""; }; - 455D603F0E71866B70EC5C125FD1DCE3 /* CircledIconView.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = CircledIconView.html; path = docs/Structs/CircledIconView.html; sourceTree = ""; }; - 46EC60383B136A874161FB6788E7A566 /* NumberedCircleView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = NumberedCircleView.swift; sourceTree = ""; }; - 47B1BBCA1F9E089FA8AF92FB2B090028 /* jazzy.search.js */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.javascript; name = jazzy.search.js; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/js/jazzy.search.js; sourceTree = ""; }; - 4801813FD4B5334BD070ED5CE2E0ECC2 /* Extensions.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = Extensions.html; path = docs/Extensions.html; sourceTree = ""; }; - 48CABE3F4FDF8EA5D722838DD032F586 /* NumberedCircleView.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = NumberedCircleView.html; path = docs/Structs/NumberedCircleView.html; sourceTree = ""; }; - 49D784553AAC8B8E5FFC11DA327E51EA /* View.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = View.html; path = docs/Extensions/View.html; sourceTree = ""; }; - 4ABD3C947C6C605A6BEB3ADD0EF0E287 /* dash.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = dash.png; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/img/dash.png; sourceTree = ""; }; - 4B555C4FC5FF01432A5B9B4EB2313510 /* SnapshotTesting-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SnapshotTesting-Info.plist"; sourceTree = ""; }; - 4C0CA527311E8D6053CD18C45F669B32 /* SceneKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SceneKit.swift; path = Sources/SnapshotTesting/Snapshotting/SceneKit.swift; sourceTree = ""; }; - 4E753134DBAC9E58D31D4D4950BA6E89 /* Pods-StepperView_Watch Extension-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-StepperView_Watch Extension-umbrella.h"; sourceTree = ""; }; - 4EA5DAFB8EA20FA670B63AC5FCD0523C /* Pods_StepperView_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_StepperView_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 51DFDE88834F7E40014E803B6B644499 /* AssertSnapshot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssertSnapshot.swift; path = Sources/SnapshotTesting/AssertSnapshot.swift; sourceTree = ""; }; - 51F952AD7FE401BD0C8D99835194E95D /* StepperView-iOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "StepperView-iOS.debug.xcconfig"; sourceTree = ""; }; - 52A7C62F0801103698661121CE7ADAFD /* PitstopHeightPreference.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = PitstopHeightPreference.html; path = docs/Structs/PitstopHeightPreference.html; sourceTree = ""; }; - 52EA42F1ACA479FCD8CEA179F3D02A68 /* Pods-StepperView_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-StepperView_Tests-acknowledgements.plist"; sourceTree = ""; }; - 54391EF22F06A1F3BC51780C285D8ED3 /* StepperView.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = StepperView.html; path = docs/Structs/StepperView.html; sourceTree = ""; }; - 54FCBDA07569D565233D16DCCBF1B86F /* StepIndicatorModeKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = StepIndicatorModeKey.html; path = docs/Structs/StepIndicatorModeKey.html; sourceTree = ""; }; - 55C34891961FC441E1A021D5CE301AB7 /* Pods-StepperView_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-StepperView_Tests-umbrella.h"; sourceTree = ""; }; - 55C5C70046137F82DC4DE33D106942B6 /* highlight.css */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.css; name = highlight.css; path = docs/css/highlight.css; sourceTree = ""; }; - 56AF01F689F046F167261EAD05F7C246 /* Structs.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = Structs.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs.html; sourceTree = ""; }; - 56DB778555062E61C5669596213B83F1 /* Pods-StepperView_Watch Extension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-StepperView_Watch Extension.debug.xcconfig"; sourceTree = ""; }; - 584C27168F70A918E4F29362FCBCFF00 /* String.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = String.swift; path = Sources/SnapshotTesting/Snapshotting/String.swift; sourceTree = ""; }; - 5A4C4E3CFD7A023721A45C5C02E57062 /* PitStopView.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = PitStopView.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/PitStopView.html; sourceTree = ""; }; - 5A533CBB3A830EB3B198597EF75A810D /* lunr.min.js */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.javascript; name = lunr.min.js; path = docs/js/lunr.min.js; sourceTree = ""; }; - 5A9A6F1EB1C5C48EA26D5D7726F6D56B /* IndicatorView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = IndicatorView.swift; sourceTree = ""; }; - 5BB3FA8F800EAD771A887AA0B262E0A0 /* YellowSubType.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = YellowSubType.html; path = docs/Enums/Colors/YellowSubType.html; sourceTree = ""; }; - 5E38BC9FC611939CA46A2BBAE9FCDA5F /* Pods-StepperView_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-StepperView_Tests-acknowledgements.markdown"; sourceTree = ""; }; - 5E5F1DCD5FD9F8F875446804A4DD4F19 /* RedSubType.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = RedSubType.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Enums/Colors/RedSubType.html; sourceTree = ""; }; - 5F629E626476F864CB33CDBF8DED2F05 /* EnvironmentValues.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = EnvironmentValues.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Extensions/EnvironmentValues.html; sourceTree = ""; }; - 5F974148746ADF47725F16E8AE8D554F /* CaseIterable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CaseIterable.swift; path = Sources/SnapshotTesting/Snapshotting/CaseIterable.swift; sourceTree = ""; }; - 6166C4D659B8007CAA7ACDFDAB709A46 /* StepperView-iOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "StepperView-iOS.release.xcconfig"; sourceTree = ""; }; - 61B0368E9352383AFBEDC872B3AA718E /* Pods-StepperView_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-StepperView_Tests-dummy.m"; sourceTree = ""; }; - 61F41A7F18B87E576D84805F3B52A0EF /* LoadAnimationOptionsKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = LoadAnimationOptionsKey.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/LoadAnimationOptionsKey.html; sourceTree = ""; }; - 62D194AF3F49F0CAC373B258FBAD1C78 /* SnapshotTesting-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SnapshotTesting-dummy.m"; sourceTree = ""; }; - 62D78E5653B736EEB0391D7CFE861827 /* BoundsPreferenceKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = BoundsPreferenceKey.html; path = docs/Structs/BoundsPreferenceKey.html; sourceTree = ""; }; - 6705F302B209207909142D4961024206 /* Classes.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = Classes.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Classes.html; sourceTree = ""; }; - 677F639EA9C06D0891A723A57418F598 /* Codable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Codable.swift; path = Sources/SnapshotTesting/Snapshotting/Codable.swift; sourceTree = ""; }; - 695EA27B610A259689225C726BFFC396 /* StepperIndicationType.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = StepperIndicationType.html; path = docs/Enums/StepperIndicationType.html; sourceTree = ""; }; - 6A0D19BF7BAEB7DA2481EF41D28AFEFD /* UIImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIImage.swift; path = Sources/SnapshotTesting/Snapshotting/UIImage.swift; sourceTree = ""; }; - 6AC4FA4D04AF052243FB0DD9AA68574C /* SnapshotTesting.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SnapshotTesting.modulemap; sourceTree = ""; }; - 6B726D471D3AC2F2562F9ED6506D4104 /* AnimatedCircle.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = AnimatedCircle.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/AnimatedCircle.html; sourceTree = ""; }; - 6C25ED16F20503A39DB7660CB45B5F4B /* LineOptionsKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = LineOptionsKey.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/LineOptionsKey.html; sourceTree = ""; }; - 6CEE61257AE2E38506BEBD035401EBF7 /* Pods-StepperView_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-StepperView_Example.release.xcconfig"; sourceTree = ""; }; - 6D5A449E427CEAE1AC4868076B07A864 /* StepperView-watchOS-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; name = "StepperView-watchOS-Info.plist"; path = "../StepperView-watchOS/StepperView-watchOS-Info.plist"; sourceTree = ""; }; - 6E319680C2F4C653000270E83E310B89 /* WidthPreference.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = WidthPreference.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/WidthPreference.html; sourceTree = ""; }; - 6E4B08FC986AC2CA988DA70A194536E6 /* TextView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = TextView.swift; sourceTree = ""; }; - 700BC05FDF7692464A6DF678C5C4BD36 /* Utils.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = Utils.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/Utils.html; sourceTree = ""; }; - 7076BC194CEA96FECF3A5D9955B1F08C /* VerticalHeightPreference.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = VerticalHeightPreference.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/VerticalHeightPreference.html; sourceTree = ""; }; - 7244A417F4AAD347828E9B21685B7501 /* HorizontalLineView.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = HorizontalLineView.html; path = docs/Structs/HorizontalLineView.html; sourceTree = ""; }; - 783963C783951E0D65EE95F340EB8C2F /* jquery.min.js */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.javascript; name = jquery.min.js; path = docs/js/jquery.min.js; sourceTree = ""; }; - 7B32D1BC7E72795EA838594B869053E9 /* GreenSubType.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = GreenSubType.html; path = docs/Enums/Colors/GreenSubType.html; sourceTree = ""; }; - 7B493584ABAFFEF709138B46A49D89B2 /* Pods-StepperView_Watch.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-StepperView_Watch.modulemap"; sourceTree = ""; }; - 7BD54C115329D22F554234CE17C84713 /* index.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = index.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/index.html; sourceTree = ""; }; - 7C55B0DE246DBF20E0B9D89FBD905F48 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/WatchOS.platform/Developer/SDKs/WatchOS7.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 7C9391F68BAA312A0B8FBB9F23C3B647 /* StepIndicatorHorizontalView.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = StepIndicatorHorizontalView.html; path = docs/Structs/StepIndicatorHorizontalView.html; sourceTree = ""; }; - 7E08B43EC89FB085F350E985FB509751 /* StepperView-iOS-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "StepperView-iOS-Info.plist"; sourceTree = ""; }; - 7EC2ABFACE9EF94C216607671E52A736 /* StepperLineOptions.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = StepperLineOptions.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Enums/StepperLineOptions.html; sourceTree = ""; }; - 7FA6DA9948C40DFA0B1A3AC3BBBDE7E5 /* Pods-StepperView_Watch Extension-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-StepperView_Watch Extension-dummy.m"; sourceTree = ""; }; - 848074A2B60B6B3D38247A4ACD31C220 /* jquery.min.js */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.javascript; name = jquery.min.js; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/js/jquery.min.js; sourceTree = ""; }; - 8552C0F4E4AF5BB803C0393CE438BA28 /* Diff.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Diff.swift; path = Sources/SnapshotTesting/Diff.swift; sourceTree = ""; }; - 86971AFE2030B767EC00A87CDED717B0 /* HeightPreference.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = HeightPreference.html; path = docs/Structs/HeightPreference.html; sourceTree = ""; }; - 86F4CA94BA9E82ACAF9F2405471EAFA2 /* PitStopOptionsKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = PitStopOptionsKey.html; path = docs/Structs/PitStopOptionsKey.html; sourceTree = ""; }; - 870ED47750E609DFFE5A551D3825B420 /* HeightKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = HeightKey.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/HeightKey.html; sourceTree = ""; }; - 896AD3EF550AC466B310CA921946DE43 /* StepIndicatorModeKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = StepIndicatorModeKey.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/StepIndicatorModeKey.html; sourceTree = ""; }; - 8A5227423FF6FE3204090D635C218B96 /* VerticalAlignment.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = VerticalAlignment.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Extensions/VerticalAlignment.html; sourceTree = ""; }; - 8C577625F9D0DAA58502A4DB3D7C5B65 /* AlignmentKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = AlignmentKey.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/AlignmentKey.html; sourceTree = ""; }; - 8D321BF6212627F5C951843A9B28BB14 /* StepperView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = StepperView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 8D819FD4CFE2D9AE1135737C473BB56E /* Pods-StepperView_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-StepperView_Example.debug.xcconfig"; sourceTree = ""; }; - 8EBB428E3DD4D5F8A7AAD670824E4E48 /* StepperLineOptions.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = StepperLineOptions.html; path = docs/Enums/StepperLineOptions.html; sourceTree = ""; }; - 8F7BA3A8661BBC806864F697C51D7318 /* View+Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "View+Extensions.swift"; sourceTree = ""; }; - 905F87FF2F7C555A58528D54B4CAE804 /* Colors.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = Colors.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Enums/Colors.html; sourceTree = ""; }; - 9143B1D54CE5419FADBDE2970AEFFBBB /* YellowSubType.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = YellowSubType.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Enums/Colors/YellowSubType.html; sourceTree = ""; }; - 916AFA1F3CEADA5123AF42341C9C9E74 /* PitStopView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PitStopView.swift; sourceTree = ""; }; - 91FAEE3DC5BB2141879276F62C556B9D /* StepsKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = StepsKey.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/StepsKey.html; sourceTree = ""; }; - 9321EEBF8992813520D43041AF4164EA /* Description.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Description.swift; path = Sources/SnapshotTesting/Snapshotting/Description.swift; sourceTree = ""; }; - 9435A9354B6A046C7F3B40BADDBC9238 /* StepIndicatorVerticalView.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = StepIndicatorVerticalView.html; path = docs/Structs/StepIndicatorVerticalView.html; sourceTree = ""; }; - 94CEA2A09CFDA9F1E538C1C10B5239FB /* typeahead.jquery.js */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.javascript; name = typeahead.jquery.js; path = docs/js/typeahead.jquery.js; sourceTree = ""; }; - 95B6E8DD5E9A276F4BBEF4E363D46D6F /* 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; }; - 95F9C3F74EF13D469174BE7AA984ECA8 /* StepIndicatorVerticalView.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = StepIndicatorVerticalView.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/StepIndicatorVerticalView.html; sourceTree = ""; }; - 9672A72A9E65F793E74E550478DB42E8 /* Colors.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = Colors.html; path = docs/Enums/Colors.html; sourceTree = ""; }; - 974B63788A75390A8FC7C8078CFB123B /* StepperAlignment.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = StepperAlignment.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Enums/StepperAlignment.html; sourceTree = ""; }; - 979CD95CCB2851EA30B74C797FB103B9 /* PreferenceKey+Extension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "PreferenceKey+Extension.swift"; sourceTree = ""; }; - 9AA2B725F50F1985BB7A4940E3948BD3 /* Pods-StepperView_Watch-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-StepperView_Watch-acknowledgements.plist"; sourceTree = ""; }; - 9AAEFAA81F1961E13F3499FB65E26481 /* StepperView-watchOS-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "StepperView-watchOS-umbrella.h"; path = "../StepperView-watchOS/StepperView-watchOS-umbrella.h"; sourceTree = ""; }; - 9B607C869CD98E4D57AC06BA6CD01226 /* Pods-StepperView_Watch-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-StepperView_Watch-acknowledgements.markdown"; sourceTree = ""; }; - 9BF05570F4FC5530B25624B36D5BBC7F /* Internal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Internal.swift; path = Sources/SnapshotTesting/Common/Internal.swift; sourceTree = ""; }; - 9CF5F4915B70E62E0F13998F1F418CCF /* gh.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = gh.png; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/img/gh.png; sourceTree = ""; }; - 9D6AB0AE260C020D72E5E9B816083609 /* CGRectPreferenceKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = CGRectPreferenceKey.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/CGRectPreferenceKey.html; sourceTree = ""; }; - 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 9E17A43CCEFA7C00ACD4EEF17835B7E6 /* PitStopStep.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = PitStopStep.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/PitStopStep.html; sourceTree = ""; }; - 9E84FD3EAE223A68314E7E7E878F3581 /* StepperView-watchOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "StepperView-watchOS.release.xcconfig"; path = "../StepperView-watchOS/StepperView-watchOS.release.xcconfig"; sourceTree = ""; }; - 9FAFF822F7883772CCBBF785311B59CB /* VerticalHeightPreference.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = VerticalHeightPreference.html; path = docs/Structs/VerticalHeightPreference.html; sourceTree = ""; }; - A0022B9BEC10F188E5166927C68E2BE6 /* jazzy.js */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.javascript; name = jazzy.js; path = docs/js/jazzy.js; sourceTree = ""; }; - A037DBBCCACBFACB5C39A80B1C273043 /* SnapshotTesting.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SnapshotTesting.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - A0B0363C5DA0646CFB2B3EF46BE0F078 /* StepperView-iOS-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "StepperView-iOS-umbrella.h"; sourceTree = ""; }; - A3F685A6A05B3F2EB57BEC8A22236E80 /* IndicatorKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = IndicatorKey.html; path = docs/Structs/IndicatorKey.html; sourceTree = ""; }; - A6E64D5C4F4D0FE3267F895858966B6D /* LoadingTimer.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = LoadingTimer.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Classes/LoadingTimer.html; sourceTree = ""; }; - A6EBA8A863057E6B87A019B0598462E4 /* TextView.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = TextView.html; path = docs/Structs/TextView.html; sourceTree = ""; }; - A786374E297AD3E72EF898FE0FE8DC2A /* UIViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIViewController.swift; path = Sources/SnapshotTesting/Snapshotting/UIViewController.swift; sourceTree = ""; }; - A7CCD67A742041597540C020D68418B5 /* Pods-StepperView_Watch-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-StepperView_Watch-Info.plist"; sourceTree = ""; }; - A86F0DD6C92051D8A83077FC4673DDC2 /* Snapshotting.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Snapshotting.swift; path = Sources/SnapshotTesting/Snapshotting.swift; sourceTree = ""; }; - A9FFBC57DB408A1C61378CD553B2B566 /* HeightPreference.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = HeightPreference.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/HeightPreference.html; sourceTree = ""; }; - AB81E8D19ECE99E242B3BF7394A5F463 /* StepperView-watchOS-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "StepperView-watchOS-dummy.m"; path = "../StepperView-watchOS/StepperView-watchOS-dummy.m"; sourceTree = ""; }; - AB914074C9FB52A54B0D276DDC120FD0 /* Pods-StepperView_Watch Extension.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-StepperView_Watch Extension.modulemap"; sourceTree = ""; }; - AB9C3FF3D5A915D3FE335ECD345BA973 /* SpacingKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = SpacingKey.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/SpacingKey.html; sourceTree = ""; }; - AC33CC64B00A81ECAA51CEA2D87FFB02 /* undocumented.json */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.json; name = undocumented.json; path = docs/undocumented.json; sourceTree = ""; }; - ACACCF6933BCA7DCC1F27B385811D6CD /* StepAnimationOptionsKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = StepAnimationOptionsKey.html; path = docs/Structs/StepAnimationOptionsKey.html; sourceTree = ""; }; - ACBFADB1215F4668CCCCCC8633AD7CBB /* BoundsPreferenceKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = BoundsPreferenceKey.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/BoundsPreferenceKey.html; sourceTree = ""; }; - AE86EF2D232EB2767663348789DB7E20 /* Utils.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = Utils.html; path = docs/Structs/Utils.html; sourceTree = ""; }; - AF69B0E7C253CC3D736B758D38D4E3ED /* CircledIconView.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = CircledIconView.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/CircledIconView.html; sourceTree = ""; }; - AF83E9F0989C023E4AE6461B22EEB26E /* Structs.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = Structs.html; path = docs/Structs.html; sourceTree = ""; }; - B01D516C6763F1B1F43B3A6786891218 /* EnvironmentValues+Extension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "EnvironmentValues+Extension.swift"; sourceTree = ""; }; - B0F01D10EAA958C6B1007C37FA512146 /* Pods-StepperView_Watch Extension-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-StepperView_Watch Extension-Info.plist"; sourceTree = ""; }; - B1A900BB6ED39A4663C0B836F38C9317 /* Enums.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = Enums.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Enums.html; sourceTree = ""; }; - B260A869BC80762B5E611AADDA6CBACD /* badge.svg */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = badge.svg; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/badge.svg; sourceTree = ""; }; - B4E0F7A3D7810D7CAEA0E03932657149 /* carat.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = carat.png; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/img/carat.png; sourceTree = ""; }; - B56800A721769D828800DB2F0D236E1A /* StepperView.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = StepperView.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/StepperView.html; sourceTree = ""; }; - B71CFB432C3FDF94D75F642B5AAA27A1 /* CGRectPreferenceKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = CGRectPreferenceKey.html; path = docs/Structs/CGRectPreferenceKey.html; sourceTree = ""; }; - B7F4DA1477939461442D642761C8158E /* Pods-StepperView_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-StepperView_Example-dummy.m"; sourceTree = ""; }; - B85F63F6F0616F7FE7949F7EE63BD175 /* Wait.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Wait.swift; path = Sources/SnapshotTesting/Extensions/Wait.swift; sourceTree = ""; }; - B9751B21DE2F6E78F3DE009572494246 /* StepAnimationOptionsKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = StepAnimationOptionsKey.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/StepAnimationOptionsKey.html; sourceTree = ""; }; - BB245931AF11B771EFE2110D4AE38B80 /* AutoSpacingKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = AutoSpacingKey.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/AutoSpacingKey.html; sourceTree = ""; }; - BCE30B37E4E3E8B7E46510CF512B9EA5 /* AutoSpacingKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = AutoSpacingKey.html; path = docs/Structs/AutoSpacingKey.html; sourceTree = ""; }; - BD75F5A5493A8BB2B944A36BC5A2670D /* VerticalLineView.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = VerticalLineView.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/VerticalLineView.html; sourceTree = ""; }; - BF2156748749E12039E5059B4E61A07C /* StepperView-iOS-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "StepperView-iOS-dummy.m"; sourceTree = ""; }; - BF4286727440DD327DE2AE95BF9D44E0 /* NSImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NSImage.swift; path = Sources/SnapshotTesting/Snapshotting/NSImage.swift; sourceTree = ""; }; - C1F617EBF85EEBCCF34FE1E1B42A8784 /* Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = ""; }; - C20E55F7ABE13B5F0371BFEB6C4FF34C /* Pods-StepperView_Watch Extension-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-StepperView_Watch Extension-acknowledgements.plist"; sourceTree = ""; }; - C213B490DAAF188ECBD5D1BF7BC777E6 /* SpriteKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SpriteKit.swift; path = Sources/SnapshotTesting/Snapshotting/SpriteKit.swift; sourceTree = ""; }; - C33A460CB89A57C1B4E8CA2B6FE60E81 /* IndicatorKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = IndicatorKey.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/IndicatorKey.html; sourceTree = ""; }; - C359AED391F6ADA8E24CD9A124DA371E /* Pods-StepperView_Watch.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-StepperView_Watch.release.xcconfig"; sourceTree = ""; }; - C4BB757B0C569052CF1DBEC733FFD737 /* Data.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Data.swift; path = Sources/SnapshotTesting/Snapshotting/Data.swift; sourceTree = ""; }; - C60FBAC5FEAD2D3A19ABA9B447E9A319 /* typeahead.jquery.js */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.javascript; name = typeahead.jquery.js; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/js/typeahead.jquery.js; sourceTree = ""; }; - C6697442AD9C5B817C72F678C2413259 /* Extensions.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = Extensions.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Extensions.html; sourceTree = ""; }; - C719024204C3A03223697AF4003AF2E9 /* Pods-StepperView_Watch-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-StepperView_Watch-umbrella.h"; sourceTree = ""; }; - C836B8F59D3DBBAF3C72EC3E04029F40 /* Pods-StepperView_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-StepperView_Example-frameworks.sh"; sourceTree = ""; }; - C9133800B38183F6962BFD7DD7521FB0 /* AlignmentKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = AlignmentKey.html; path = docs/Structs/AlignmentKey.html; sourceTree = ""; }; - CA194F706F613BEF7DCADC254557C3EE /* StepperView-watchOS.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; name = "StepperView-watchOS.modulemap"; path = "../StepperView-watchOS/StepperView-watchOS.modulemap"; sourceTree = ""; }; - CBF8080AC93396593A78EFAC07C8C582 /* GraySubType.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = GraySubType.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Enums/Colors/GraySubType.html; sourceTree = ""; }; - CC69DB27C7C6E3F3799F1663B003A975 /* View.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = View.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Extensions/View.html; sourceTree = ""; }; - CCFDE4BCCC68CDA3F90058E35DB3183A /* PitStopLineOptions.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = PitStopLineOptions.html; path = docs/Enums/PitStopLineOptions.html; sourceTree = ""; }; - CD0367335418A9475527400CB190FA8B /* HorizontalLineView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = HorizontalLineView.swift; sourceTree = ""; }; - CDE7A9925C1CAC9A9869C3C58582C9EB /* Colors+Extension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "Colors+Extension.swift"; sourceTree = ""; }; - CE6DC4328B6C07C936F0EFF50DBE3257 /* CircledIconView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CircledIconView.swift; sourceTree = ""; }; - D01A40E39EACD3272B5C8AD0585526C3 /* HeightKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = HeightKey.html; path = docs/Structs/HeightKey.html; sourceTree = ""; }; - D1EDA2CFF4FC644BF0BA1960AF77E401 /* SnapshotTestCase.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SnapshotTestCase.swift; path = Sources/SnapshotTesting/SnapshotTestCase.swift; sourceTree = ""; }; - D34051EC87A66DF65C7B3D8627594429 /* NSView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NSView.swift; path = Sources/SnapshotTesting/Snapshotting/NSView.swift; sourceTree = ""; }; - D422FB1A173FC77250CF807B96E00CA4 /* docSet.dsidx */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = file; name = docSet.dsidx; path = docs/docsets/StepperView.docset/Contents/Resources/docSet.dsidx; sourceTree = ""; }; - D4DAFA16FAB82DF2EABB99CBC2B82F42 /* PitStopLineOptions.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = PitStopLineOptions.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Enums/PitStopLineOptions.html; sourceTree = ""; }; - D68BA769606C404F7BC02E5F4D74C67A /* Pods-StepperView_Watch Extension-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-StepperView_Watch Extension-frameworks.sh"; sourceTree = ""; }; - D91A7437B5D61C5D68DDF1F242E37954 /* WidthKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = WidthKey.html; path = docs/Structs/WidthKey.html; sourceTree = ""; }; - D9675BF7F1617547A197EF54B4CA5417 /* VerticalAlignment.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = VerticalAlignment.html; path = docs/Extensions/VerticalAlignment.html; sourceTree = ""; }; - DA73118AF182121135983C0FEC206EA7 /* StepsKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = StepsKey.html; path = docs/Structs/StepsKey.html; sourceTree = ""; }; - DA92FF722DDBF737B72D547D8C6D8CF7 /* StepperView.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; path = StepperView.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - DA9C38ACEC8EF6779198630A964BC9E8 /* NSViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NSViewController.swift; path = Sources/SnapshotTesting/Snapshotting/NSViewController.swift; sourceTree = ""; }; - DC483163D13D5AE3092F49F09C5E08BE /* lunr.min.js */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.javascript; name = lunr.min.js; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/js/lunr.min.js; sourceTree = ""; }; - DE5CB9BA70CE2A0FB3E198A4FB9A5437 /* Any.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Any.swift; path = Sources/SnapshotTesting/Snapshotting/Any.swift; sourceTree = ""; }; - DEC69FB64FCCC5770B842B7665E4A466 /* EnvironmentValues.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = EnvironmentValues.html; path = docs/Extensions/EnvironmentValues.html; sourceTree = ""; }; - DF19BCC9495D48049049450AADB9A50C /* AssertInlineSnapshot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AssertInlineSnapshot.swift; path = Sources/SnapshotTesting/AssertInlineSnapshot.swift; sourceTree = ""; }; - DF61B59F1D4C0E7787C3F04A16469B03 /* jazzy.js */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.javascript; name = jazzy.js; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/js/jazzy.js; sourceTree = ""; }; - E2223A0FBBFB25BCAE60975D90CE7350 /* WidthPreference.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = WidthPreference.html; path = docs/Structs/WidthPreference.html; sourceTree = ""; }; - E2BCD979D29E04E97B98BBB14849D22C /* Enums.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = Enums.html; path = docs/Enums.html; sourceTree = ""; }; - E3F1D15D17EC2E70B267EDDF7AABA57C /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; - E4DD9D4178FD3B4CF6DEB2C8DB332F8B /* gh.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = gh.png; path = docs/img/gh.png; sourceTree = ""; }; - E6A3274FB1B6B5844F8D1A124BE5B0EE /* URLRequest.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = URLRequest.swift; path = Sources/SnapshotTesting/Snapshotting/URLRequest.swift; sourceTree = ""; }; - E7C4FD2B276ECC1F50B4C183FEE3D3FA /* StepperView-iOS.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "StepperView-iOS.modulemap"; sourceTree = ""; }; - E864098E6FD74332C6B4AB96AC43269E /* LoadAnimationOptionsKey.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = LoadAnimationOptionsKey.html; path = docs/Structs/LoadAnimationOptionsKey.html; sourceTree = ""; }; - E8EB7C6EDA55DB3E2CE3E56D2CCDAF05 /* undocumented.json */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.json; name = undocumented.json; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/undocumented.json; sourceTree = ""; }; - EA229855983DE34FAA3DF12ECEE5E609 /* search.json */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.json; name = search.json; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/search.json; sourceTree = ""; }; - EA4CE37FD5420F6CA4CF69FAAF170DA5 /* StepperView-watchOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "StepperView-watchOS.debug.xcconfig"; path = "../StepperView-watchOS/StepperView-watchOS.debug.xcconfig"; sourceTree = ""; }; - EB353159037433B43D06771A808670A2 /* PlistEncoder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PlistEncoder.swift; path = Sources/SnapshotTesting/Common/PlistEncoder.swift; sourceTree = ""; }; - EC567C5BB6CB7F10A927240C632C8667 /* PitstopHeightPreference.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = PitstopHeightPreference.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/PitstopHeightPreference.html; sourceTree = ""; }; - ED7C57D10BC9CBD7A3EAE6285333D907 /* PitStopSteps.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = PitStopSteps.html; path = docs/Structs/PitStopSteps.html; sourceTree = ""; }; - ED7DB61B58C2A61F87326D9F40CD59B6 /* BlueSubType.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = BlueSubType.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Enums/Colors/BlueSubType.html; sourceTree = ""; }; - EDA2CE38DA8EC6D33CAB00E6A13EDF55 /* GreenSubType.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = GreenSubType.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Enums/Colors/GreenSubType.html; sourceTree = ""; }; - EEADB4AB9815A1758DFB4B4E7BE5E5D5 /* StepperIndicationType.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = StepperIndicationType.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Enums/StepperIndicationType.html; sourceTree = ""; }; - EEAE8840A67B4CB05ECDAF5A85E24B50 /* Pods-StepperView_Tests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-StepperView_Tests-Info.plist"; sourceTree = ""; }; - F009379213378C5E0516F808E9B9EEDF /* spinner.gif */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.gif; name = spinner.gif; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/img/spinner.gif; sourceTree = ""; }; - F391ADE3F5DF658D8CF12293A6CEA007 /* dash.png */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = image.png; name = dash.png; path = docs/img/dash.png; sourceTree = ""; }; - F49E36693402E6633ACB1E1FF1A6D972 /* CGRectData.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = CGRectData.html; path = docs/Structs/CGRectData.html; sourceTree = ""; }; - F55E6BBCED3076493C7A63511BF05C1E /* PitStopLineView.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = PitStopLineView.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/PitStopLineView.html; sourceTree = ""; }; - F631A9742E4B7230AEBCE296A7A92738 /* Pods_StepperView_Watch_Extension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_StepperView_Watch_Extension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F6D0F381CFC2E71B5848DDF3C61525EA /* Pods-StepperView_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-StepperView_Example.modulemap"; sourceTree = ""; }; - F8C5BFB2709ACA3DB976330C93F0F0B0 /* Async.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Async.swift; path = Sources/SnapshotTesting/Async.swift; sourceTree = ""; }; - F9A05705B4F34D90915ACEB8EFF0A79B /* jazzy.search.js */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.javascript; name = jazzy.search.js; path = docs/js/jazzy.search.js; sourceTree = ""; }; - FA3F145C60CFFB10F1798BB55725230F /* PitStopLineView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PitStopLineView.swift; sourceTree = ""; }; - FB65DF8DCDF0765964216309AC2E465C /* LoadingTimer.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = LoadingTimer.html; path = docs/Classes/LoadingTimer.html; sourceTree = ""; }; - FCEF1F8AD5FD0D1DCFBC25DA68B4EF53 /* PitStopSteps.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = PitStopSteps.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/PitStopSteps.html; sourceTree = ""; }; - FD10704D670BE755E3C1A04C482F14BB /* CALayer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CALayer.swift; path = Sources/SnapshotTesting/Snapshotting/CALayer.swift; sourceTree = ""; }; - FDBD95042ADB4996DBD8ACF049E2736F /* Classes.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = Classes.html; path = docs/Classes.html; sourceTree = ""; }; - FDD7608CB1F5A7D411A01D04798CB71F /* BlueSubType.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html; name = BlueSubType.html; path = docs/Enums/Colors/BlueSubType.html; sourceTree = ""; }; - FE128A218A192257E5F0B5235B9D930E /* highlight.css */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.css; name = highlight.css; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/css/highlight.css; sourceTree = ""; }; - FE54E0EE77832C01DC96FA42213EFA34 /* SnapshotTesting-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SnapshotTesting-umbrella.h"; sourceTree = ""; }; - FF43C5035F438F6E91633727D07FF8EB /* TextView.html */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.html.documentation; name = TextView.html; path = docs/docsets/StepperView.docset/Contents/Resources/Documents/Structs/TextView.html; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 1AF852CD197E8669183F54DC80E247B7 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5396DD33A8FBCFC2417D455B6189A5EC /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 7B68B79D506F831E8850A41FC5D36691 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 41260DEE55CBAF16B3A15CFBDFCB3AAE /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 9707D226B941CAD34D16D1234AFB5475 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1141CE5550EE2FB872C3323A2BE2426F /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 99A7B224992038A9BC53EABC3D72694B /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 6EACA4857F2C86A910F9AC60587B8C5E /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 9E6D64D3BD4FFA53A5380CBA763579B3 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - D72925EA88057F88A8AC3D62F7D8FE88 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - A3753966D6558AC3D7EB88C394F87259 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - A39A5E1BB80978C9AC68610A04E56545 /* Foundation.framework in Frameworks */, - E6AAA4D897FFA74C28D27419A600B74B /* XCTest.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - FE91C3DE35F2558A7A542ADE2EEF94D9 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 7A0DA974654D5A3FE765204467940805 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 002FC2840F803E54F3467DE9608342BB /* Frameworks */ = { - isa = PBXGroup; - children = ( - 447E8431544BE76CEB5DA745ACDB24A5 /* iOS */, - 1491C7DC7B71FD31E5181B94D72B57F9 /* watchOS */, - ); - name = Frameworks; - sourceTree = ""; - }; - 1491C7DC7B71FD31E5181B94D72B57F9 /* watchOS */ = { - isa = PBXGroup; - children = ( - 7C55B0DE246DBF20E0B9D89FBD905F48 /* Foundation.framework */, - ); - name = watchOS; - sourceTree = ""; - }; - 1D6BC62242E7A714F53C7006099CCBBB /* Components */ = { - isa = PBXGroup; - children = ( - 6E4B08FC986AC2CA988DA70A194536E6 /* TextView.swift */, - ); - path = Components; - sourceTree = ""; - }; - 2375A1C49CD4C01E3420161DD46134F5 /* Support Files */ = { - isa = PBXGroup; - children = ( - E7C4FD2B276ECC1F50B4C183FEE3D3FA /* StepperView-iOS.modulemap */, - BF2156748749E12039E5059B4E61A07C /* StepperView-iOS-dummy.m */, - 7E08B43EC89FB085F350E985FB509751 /* StepperView-iOS-Info.plist */, - 396DB9F8CD8B381D0851541BA7E8885C /* StepperView-iOS-prefix.pch */, - A0B0363C5DA0646CFB2B3EF46BE0F078 /* StepperView-iOS-umbrella.h */, - 51F952AD7FE401BD0C8D99835194E95D /* StepperView-iOS.debug.xcconfig */, - 6166C4D659B8007CAA7ACDFDAB709A46 /* StepperView-iOS.release.xcconfig */, - CA194F706F613BEF7DCADC254557C3EE /* StepperView-watchOS.modulemap */, - AB81E8D19ECE99E242B3BF7394A5F463 /* StepperView-watchOS-dummy.m */, - 6D5A449E427CEAE1AC4868076B07A864 /* StepperView-watchOS-Info.plist */, - 1A0E4BDAF541364B192E37E386588577 /* StepperView-watchOS-prefix.pch */, - 9AAEFAA81F1961E13F3499FB65E26481 /* StepperView-watchOS-umbrella.h */, - EA4CE37FD5420F6CA4CF69FAAF170DA5 /* StepperView-watchOS.debug.xcconfig */, - 9E84FD3EAE223A68314E7E7E878F3581 /* StepperView-watchOS.release.xcconfig */, - ); - name = "Support Files"; - path = "Example/Pods/Target Support Files/StepperView-iOS"; - sourceTree = ""; - }; - 447E8431544BE76CEB5DA745ACDB24A5 /* iOS */ = { - isa = PBXGroup; - children = ( - 3443D522D1F9EC9954ECAFA5CCDABBE6 /* Foundation.framework */, - 95B6E8DD5E9A276F4BBEF4E363D46D6F /* XCTest.framework */, - ); - name = iOS; - sourceTree = ""; - }; - 539E5B6C767B836C59A82AD64850B766 /* Utils */ = { - isa = PBXGroup; - children = ( - 2AA10EBD32FE9876D6FEBA0DB784C008 /* LoadingTimer.swift */, - C1F617EBF85EEBCCF34FE1E1B42A8784 /* Utils.swift */, - ); - name = Utils; - path = Sources/StepperView/Utils; - sourceTree = ""; - }; - 6797754039C8529BEAA26885B066DAA5 /* Pods-StepperView_Example */ = { - isa = PBXGroup; - children = ( - F6D0F381CFC2E71B5848DDF3C61525EA /* Pods-StepperView_Example.modulemap */, - 3BF08A054DB2EFFB34A02DB28C737D50 /* Pods-StepperView_Example-acknowledgements.markdown */, - 19D794AFA885DAF5937D46F11AB03470 /* Pods-StepperView_Example-acknowledgements.plist */, - B7F4DA1477939461442D642761C8158E /* Pods-StepperView_Example-dummy.m */, - C836B8F59D3DBBAF3C72EC3E04029F40 /* Pods-StepperView_Example-frameworks.sh */, - 0D55D1033AA5478F71538396CDD100DF /* Pods-StepperView_Example-Info.plist */, - 2A7C6F0E5A7E5F2F3E4BA214F0586F85 /* Pods-StepperView_Example-umbrella.h */, - 8D819FD4CFE2D9AE1135737C473BB56E /* Pods-StepperView_Example.debug.xcconfig */, - 6CEE61257AE2E38506BEBD035401EBF7 /* Pods-StepperView_Example.release.xcconfig */, - ); - name = "Pods-StepperView_Example"; - path = "Target Support Files/Pods-StepperView_Example"; - sourceTree = ""; - }; - 6FC9AF4CEA617D29D9D2246CB9DCCBEA /* Targets Support Files */ = { - isa = PBXGroup; - children = ( - 6797754039C8529BEAA26885B066DAA5 /* Pods-StepperView_Example */, - 722BD011D83C252B320CD971E2F130CF /* Pods-StepperView_Tests */, - 9CBC708B97F0A9B01A63E047528FEC7D /* Pods-StepperView_Watch */, - 872C8C515CE67B7F8B7A1E7728B3BB1B /* Pods-StepperView_Watch Extension */, - ); - name = "Targets Support Files"; - sourceTree = ""; - }; - 722BD011D83C252B320CD971E2F130CF /* Pods-StepperView_Tests */ = { - isa = PBXGroup; - children = ( - 1E1FBE49D989987B3AF4D994A0029CF2 /* Pods-StepperView_Tests.modulemap */, - 5E38BC9FC611939CA46A2BBAE9FCDA5F /* Pods-StepperView_Tests-acknowledgements.markdown */, - 52EA42F1ACA479FCD8CEA179F3D02A68 /* Pods-StepperView_Tests-acknowledgements.plist */, - 61B0368E9352383AFBEDC872B3AA718E /* Pods-StepperView_Tests-dummy.m */, - 1253A303ED2B11912261F6EAD3625F1A /* Pods-StepperView_Tests-frameworks.sh */, - EEAE8840A67B4CB05ECDAF5A85E24B50 /* Pods-StepperView_Tests-Info.plist */, - 55C34891961FC441E1A021D5CE301AB7 /* Pods-StepperView_Tests-umbrella.h */, - 21FA315ABE27D7DE0FD7B793A4222387 /* Pods-StepperView_Tests.debug.xcconfig */, - 0B1AF4EE96053C3B0D8314A16AAA6B2E /* Pods-StepperView_Tests.release.xcconfig */, - ); - name = "Pods-StepperView_Tests"; - path = "Target Support Files/Pods-StepperView_Tests"; - sourceTree = ""; - }; - 872C8C515CE67B7F8B7A1E7728B3BB1B /* Pods-StepperView_Watch Extension */ = { - isa = PBXGroup; - children = ( - AB914074C9FB52A54B0D276DDC120FD0 /* Pods-StepperView_Watch Extension.modulemap */, - 4375A694F5270ED1FEE5FD35BAF8BD4E /* Pods-StepperView_Watch Extension-acknowledgements.markdown */, - C20E55F7ABE13B5F0371BFEB6C4FF34C /* Pods-StepperView_Watch Extension-acknowledgements.plist */, - 7FA6DA9948C40DFA0B1A3AC3BBBDE7E5 /* Pods-StepperView_Watch Extension-dummy.m */, - D68BA769606C404F7BC02E5F4D74C67A /* Pods-StepperView_Watch Extension-frameworks.sh */, - B0F01D10EAA958C6B1007C37FA512146 /* Pods-StepperView_Watch Extension-Info.plist */, - 4E753134DBAC9E58D31D4D4950BA6E89 /* Pods-StepperView_Watch Extension-umbrella.h */, - 56DB778555062E61C5669596213B83F1 /* Pods-StepperView_Watch Extension.debug.xcconfig */, - 44E083363A4248B2AE63427EE12EBE61 /* Pods-StepperView_Watch Extension.release.xcconfig */, - ); - name = "Pods-StepperView_Watch Extension"; - path = "Target Support Files/Pods-StepperView_Watch Extension"; - sourceTree = ""; - }; - 893236DF3AEB52A9326AA24F08665C25 /* Products */ = { - isa = PBXGroup; - children = ( - 05C028F74B9508FE72717D3BB2BD7B7A /* Pods_StepperView_Example.framework */, - 4EA5DAFB8EA20FA670B63AC5FCD0523C /* Pods_StepperView_Tests.framework */, - 3F67E7AC212DABDF49FEC3651669CA0A /* Pods_StepperView_Watch.framework */, - F631A9742E4B7230AEBCE296A7A92738 /* Pods_StepperView_Watch_Extension.framework */, - A037DBBCCACBFACB5C39A80B1C273043 /* SnapshotTesting.framework */, - 8D321BF6212627F5C951843A9B28BB14 /* StepperView.framework */, - 1E35132387A01BF6418B815210B677B4 /* StepperView.framework */, - ); - name = Products; - sourceTree = ""; - }; - 93F0CEF623DECB20DA8A258F54F14284 /* Indicators */ = { - isa = PBXGroup; - children = ( - CE6DC4328B6C07C936F0EFF50DBE3257 /* CircledIconView.swift */, - 5A9A6F1EB1C5C48EA26D5D7726F6D56B /* IndicatorView.swift */, - 46EC60383B136A874161FB6788E7A566 /* NumberedCircleView.swift */, - ); - path = Indicators; - sourceTree = ""; - }; - 9659C94C85FA0FD9A56D413149C89233 /* Support Files */ = { - isa = PBXGroup; - children = ( - 6AC4FA4D04AF052243FB0DD9AA68574C /* SnapshotTesting.modulemap */, - 62D194AF3F49F0CAC373B258FBAD1C78 /* SnapshotTesting-dummy.m */, - 4B555C4FC5FF01432A5B9B4EB2313510 /* SnapshotTesting-Info.plist */, - 34A0A3CC14396D2DA1E2D3FD64DEDAED /* SnapshotTesting-prefix.pch */, - FE54E0EE77832C01DC96FA42213EFA34 /* SnapshotTesting-umbrella.h */, - 2E2CA03B708D8424B73A38D4C8C250F5 /* SnapshotTesting.debug.xcconfig */, - 314A21CD4CA38212B1C9361BB856ED68 /* SnapshotTesting.release.xcconfig */, - ); - name = "Support Files"; - path = "../Target Support Files/SnapshotTesting"; - sourceTree = ""; - }; - 9CBC708B97F0A9B01A63E047528FEC7D /* Pods-StepperView_Watch */ = { - isa = PBXGroup; - children = ( - 7B493584ABAFFEF709138B46A49D89B2 /* Pods-StepperView_Watch.modulemap */, - 9B607C869CD98E4D57AC06BA6CD01226 /* Pods-StepperView_Watch-acknowledgements.markdown */, - 9AA2B725F50F1985BB7A4940E3948BD3 /* Pods-StepperView_Watch-acknowledgements.plist */, - 3DB364750AEF9F684ED1A0611680B9F3 /* Pods-StepperView_Watch-dummy.m */, - 39389C40BF1E4F29AFA9E00EF4AA7CFA /* Pods-StepperView_Watch-frameworks.sh */, - A7CCD67A742041597540C020D68418B5 /* Pods-StepperView_Watch-Info.plist */, - C719024204C3A03223697AF4003AF2E9 /* Pods-StepperView_Watch-umbrella.h */, - 353AACBC0866DF85C19BF4739696B13D /* Pods-StepperView_Watch.debug.xcconfig */, - C359AED391F6ADA8E24CD9A124DA371E /* Pods-StepperView_Watch.release.xcconfig */, - ); - name = "Pods-StepperView_Watch"; - path = "Target Support Files/Pods-StepperView_Watch"; - sourceTree = ""; - }; - A55E295C2DE3E85E3BE433DD7226D756 /* SnapshotTesting */ = { - isa = PBXGroup; - children = ( - DE5CB9BA70CE2A0FB3E198A4FB9A5437 /* Any.swift */, - DF19BCC9495D48049049450AADB9A50C /* AssertInlineSnapshot.swift */, - 51DFDE88834F7E40014E803B6B644499 /* AssertSnapshot.swift */, - F8C5BFB2709ACA3DB976330C93F0F0B0 /* Async.swift */, - FD10704D670BE755E3C1A04C482F14BB /* CALayer.swift */, - 5F974148746ADF47725F16E8AE8D554F /* CaseIterable.swift */, - 677F639EA9C06D0891A723A57418F598 /* Codable.swift */, - C4BB757B0C569052CF1DBEC733FFD737 /* Data.swift */, - 9321EEBF8992813520D43041AF4164EA /* Description.swift */, - 8552C0F4E4AF5BB803C0393CE438BA28 /* Diff.swift */, - 09FD26E8685603ED773645E9748DE892 /* Diffing.swift */, - 9BF05570F4FC5530B25624B36D5BBC7F /* Internal.swift */, - BF4286727440DD327DE2AE95BF9D44E0 /* NSImage.swift */, - D34051EC87A66DF65C7B3D8627594429 /* NSView.swift */, - DA9C38ACEC8EF6779198630A964BC9E8 /* NSViewController.swift */, - EB353159037433B43D06771A808670A2 /* PlistEncoder.swift */, - 4C0CA527311E8D6053CD18C45F669B32 /* SceneKit.swift */, - D1EDA2CFF4FC644BF0BA1960AF77E401 /* SnapshotTestCase.swift */, - A86F0DD6C92051D8A83077FC4673DDC2 /* Snapshotting.swift */, - C213B490DAAF188ECBD5D1BF7BC777E6 /* SpriteKit.swift */, - 584C27168F70A918E4F29362FCBCFF00 /* String.swift */, - 24B910A7CADF2217BFBFDB9C98EC114A /* String+SpecialCharacters.swift */, - 6A0D19BF7BAEB7DA2481EF41D28AFEFD /* UIImage.swift */, - 444F03C0C7E948C8C4716A1692A121F3 /* UIView.swift */, - A786374E297AD3E72EF898FE0FE8DC2A /* UIViewController.swift */, - E6A3274FB1B6B5844F8D1A124BE5B0EE /* URLRequest.swift */, - 3912642063EA0830CFF13B31BF711D13 /* View.swift */, - B85F63F6F0616F7FE7949F7EE63BD175 /* Wait.swift */, - 410FC8A7EC948E73AC72E902BE6E37E3 /* XCTAttachment.swift */, - 9659C94C85FA0FD9A56D413149C89233 /* Support Files */, - ); - path = SnapshotTesting; - sourceTree = ""; - }; - A6070CAE37959EE37530D31A4CAD7008 /* Pods */ = { - isa = PBXGroup; - children = ( - A55E295C2DE3E85E3BE433DD7226D756 /* SnapshotTesting */, - ); - name = Pods; - sourceTree = ""; - }; - AFA4D17C2283C7B2B13DD6DE061BB3FF /* Pod */ = { - isa = PBXGroup; - children = ( - 8C577625F9D0DAA58502A4DB3D7C5B65 /* AlignmentKey.html */, - C9133800B38183F6962BFD7DD7521FB0 /* AlignmentKey.html */, - 39303D4D03A8415AD4177C86680F7E3D /* AnimatedCircle.html */, - 6B726D471D3AC2F2562F9ED6506D4104 /* AnimatedCircle.html */, - BB245931AF11B771EFE2110D4AE38B80 /* AutoSpacingKey.html */, - BCE30B37E4E3E8B7E46510CF512B9EA5 /* AutoSpacingKey.html */, - B260A869BC80762B5E611AADDA6CBACD /* badge.svg */, - 28A73342D042AB46CD0B4A1C1397E7D5 /* badge.svg */, - FDD7608CB1F5A7D411A01D04798CB71F /* BlueSubType.html */, - ED7DB61B58C2A61F87326D9F40CD59B6 /* BlueSubType.html */, - ACBFADB1215F4668CCCCCC8633AD7CBB /* BoundsPreferenceKey.html */, - 62D78E5653B736EEB0391D7CFE861827 /* BoundsPreferenceKey.html */, - 02F0A58382FFD9E26C50F1199AFC54EE /* carat.png */, - B4E0F7A3D7810D7CAEA0E03932657149 /* carat.png */, - 17AE62194BF923BBA9E316BAEBBABF3E /* CGRectData.html */, - F49E36693402E6633ACB1E1FF1A6D972 /* CGRectData.html */, - B71CFB432C3FDF94D75F642B5AAA27A1 /* CGRectPreferenceKey.html */, - 9D6AB0AE260C020D72E5E9B816083609 /* CGRectPreferenceKey.html */, - AF69B0E7C253CC3D736B758D38D4E3ED /* CircledIconView.html */, - 455D603F0E71866B70EC5C125FD1DCE3 /* CircledIconView.html */, - FDBD95042ADB4996DBD8ACF049E2736F /* Classes.html */, - 6705F302B209207909142D4961024206 /* Classes.html */, - 9672A72A9E65F793E74E550478DB42E8 /* Colors.html */, - 905F87FF2F7C555A58528D54B4CAE804 /* Colors.html */, - F391ADE3F5DF658D8CF12293A6CEA007 /* dash.png */, - 4ABD3C947C6C605A6BEB3ADD0EF0E287 /* dash.png */, - D422FB1A173FC77250CF807B96E00CA4 /* docSet.dsidx */, - E2BCD979D29E04E97B98BBB14849D22C /* Enums.html */, - B1A900BB6ED39A4663C0B836F38C9317 /* Enums.html */, - DEC69FB64FCCC5770B842B7665E4A466 /* EnvironmentValues.html */, - 5F629E626476F864CB33CDBF8DED2F05 /* EnvironmentValues.html */, - C6697442AD9C5B817C72F678C2413259 /* Extensions.html */, - 4801813FD4B5334BD070ED5CE2E0ECC2 /* Extensions.html */, - 9CF5F4915B70E62E0F13998F1F418CCF /* gh.png */, - E4DD9D4178FD3B4CF6DEB2C8DB332F8B /* gh.png */, - 3F94819CBBD0D4391103D2B79A1FFD02 /* GraySubType.html */, - CBF8080AC93396593A78EFAC07C8C582 /* GraySubType.html */, - EDA2CE38DA8EC6D33CAB00E6A13EDF55 /* GreenSubType.html */, - 7B32D1BC7E72795EA838594B869053E9 /* GreenSubType.html */, - D01A40E39EACD3272B5C8AD0585526C3 /* HeightKey.html */, - 870ED47750E609DFFE5A551D3825B420 /* HeightKey.html */, - A9FFBC57DB408A1C61378CD553B2B566 /* HeightPreference.html */, - 86971AFE2030B767EC00A87CDED717B0 /* HeightPreference.html */, - FE128A218A192257E5F0B5235B9D930E /* highlight.css */, - 55C5C70046137F82DC4DE33D106942B6 /* highlight.css */, - 2ED85E7A691678A88850C24687E42D66 /* HorizontalLineView.html */, - 7244A417F4AAD347828E9B21685B7501 /* HorizontalLineView.html */, - 7BD54C115329D22F554234CE17C84713 /* index.html */, - 32FCE75B30BDD64A48AA9AFBEA1EB8C8 /* index.html */, - A3F685A6A05B3F2EB57BEC8A22236E80 /* IndicatorKey.html */, - C33A460CB89A57C1B4E8CA2B6FE60E81 /* IndicatorKey.html */, - 21E1920C6987E4D2E534F24A4B041330 /* IndicatorView.html */, - 36838DEBAE6E2B39661DBBA32254A4B1 /* IndicatorView.html */, - 27E120B581E98313203985771E3647B8 /* Info.plist */, - 1F2E911E0E35A5F125DE1E1EDB4AB79E /* jazzy.css */, - 010815BC1D58FF43EC5F2FA2A7AE865D /* jazzy.css */, - A0022B9BEC10F188E5166927C68E2BE6 /* jazzy.js */, - DF61B59F1D4C0E7787C3F04A16469B03 /* jazzy.js */, - F9A05705B4F34D90915ACEB8EFF0A79B /* jazzy.search.js */, - 47B1BBCA1F9E089FA8AF92FB2B090028 /* jazzy.search.js */, - 783963C783951E0D65EE95F340EB8C2F /* jquery.min.js */, - 848074A2B60B6B3D38247A4ACD31C220 /* jquery.min.js */, - E3F1D15D17EC2E70B267EDDF7AABA57C /* LICENSE */, - 6C25ED16F20503A39DB7660CB45B5F4B /* LineOptionsKey.html */, - 1F958D88B1FFB51BEA0BCFA5B9C77AB4 /* LineOptionsKey.html */, - E864098E6FD74332C6B4AB96AC43269E /* LoadAnimationOptionsKey.html */, - 61F41A7F18B87E576D84805F3B52A0EF /* LoadAnimationOptionsKey.html */, - A6E64D5C4F4D0FE3267F895858966B6D /* LoadingTimer.html */, - FB65DF8DCDF0765964216309AC2E465C /* LoadingTimer.html */, - 5A533CBB3A830EB3B198597EF75A810D /* lunr.min.js */, - DC483163D13D5AE3092F49F09C5E08BE /* lunr.min.js */, - 48CABE3F4FDF8EA5D722838DD032F586 /* NumberedCircleView.html */, - 26A17C151ED51A5E3D49F52961E29232 /* NumberedCircleView.html */, - 52A7C62F0801103698661121CE7ADAFD /* PitstopHeightPreference.html */, - EC567C5BB6CB7F10A927240C632C8667 /* PitstopHeightPreference.html */, - D4DAFA16FAB82DF2EABB99CBC2B82F42 /* PitStopLineOptions.html */, - CCFDE4BCCC68CDA3F90058E35DB3183A /* PitStopLineOptions.html */, - F55E6BBCED3076493C7A63511BF05C1E /* PitStopLineView.html */, - 106A1D510429ACDD808BD330FB52E6F3 /* PitStopLineView.html */, - 1A87142BB0463B2330C3E45E356F39B1 /* PitStopOptionsKey.html */, - 86F4CA94BA9E82ACAF9F2405471EAFA2 /* PitStopOptionsKey.html */, - 9E17A43CCEFA7C00ACD4EEF17835B7E6 /* PitStopStep.html */, - 10403D102B45E778B1869E6956372AD4 /* PitStopStep.html */, - ED7C57D10BC9CBD7A3EAE6285333D907 /* PitStopSteps.html */, - FCEF1F8AD5FD0D1DCFBC25DA68B4EF53 /* PitStopSteps.html */, - 5A4C4E3CFD7A023721A45C5C02E57062 /* PitStopView.html */, - 2085264E20A9F06194A6BDB219885BE2 /* PitStopView.html */, - 448E1525949480A6C7A7DB4279B2E907 /* README.md */, - 267DC11E2F9816EF51D2ABC239C0D529 /* RedSubType.html */, - 5E5F1DCD5FD9F8F875446804A4DD4F19 /* RedSubType.html */, - EA229855983DE34FAA3DF12ECEE5E609 /* search.json */, - 07480BA37145A61B2F6B485C2EA5A926 /* search.json */, - AB9C3FF3D5A915D3FE335ECD345BA973 /* SpacingKey.html */, - 02139E7D45839154693C7CF56620BD04 /* SpacingKey.html */, - F009379213378C5E0516F808E9B9EEDF /* spinner.gif */, - 031AF3F2601DAF333EE3F48174BE3021 /* spinner.gif */, - B9751B21DE2F6E78F3DE009572494246 /* StepAnimationOptionsKey.html */, - ACACCF6933BCA7DCC1F27B385811D6CD /* StepAnimationOptionsKey.html */, - 7C9391F68BAA312A0B8FBB9F23C3B647 /* StepIndicatorHorizontalView.html */, - 09E6CE690A99D6AF18A5C486E2F5ECCB /* StepIndicatorHorizontalView.html */, - 54FCBDA07569D565233D16DCCBF1B86F /* StepIndicatorModeKey.html */, - 896AD3EF550AC466B310CA921946DE43 /* StepIndicatorModeKey.html */, - 9435A9354B6A046C7F3B40BADDBC9238 /* StepIndicatorVerticalView.html */, - 95F9C3F74EF13D469174BE7AA984ECA8 /* StepIndicatorVerticalView.html */, - 1667A061847303499F1BF7F638D3B2C2 /* StepperAlignment.html */, - 974B63788A75390A8FC7C8078CFB123B /* StepperAlignment.html */, - 695EA27B610A259689225C726BFFC396 /* StepperIndicationType.html */, - EEADB4AB9815A1758DFB4B4E7BE5E5D5 /* StepperIndicationType.html */, - 7EC2ABFACE9EF94C216607671E52A736 /* StepperLineOptions.html */, - 8EBB428E3DD4D5F8A7AAD670824E4E48 /* StepperLineOptions.html */, - 4037DE289DF081A073997DE7C10F8A8E /* StepperMode.html */, - 2278993DA9270E6BB82EB6AB6488F966 /* StepperMode.html */, - B56800A721769D828800DB2F0D236E1A /* StepperView.html */, - 54391EF22F06A1F3BC51780C285D8ED3 /* StepperView.html */, - DA92FF722DDBF737B72D547D8C6D8CF7 /* StepperView.podspec */, - 0906268C0BFB51BB50248062A742EF82 /* StepperView.tgz */, - 91FAEE3DC5BB2141879276F62C556B9D /* StepsKey.html */, - DA73118AF182121135983C0FEC206EA7 /* StepsKey.html */, - AF83E9F0989C023E4AE6461B22EEB26E /* Structs.html */, - 56AF01F689F046F167261EAD05F7C246 /* Structs.html */, - A6EBA8A863057E6B87A019B0598462E4 /* TextView.html */, - FF43C5035F438F6E91633727D07FF8EB /* TextView.html */, - C60FBAC5FEAD2D3A19ABA9B447E9A319 /* typeahead.jquery.js */, - 94CEA2A09CFDA9F1E538C1C10B5239FB /* typeahead.jquery.js */, - E8EB7C6EDA55DB3E2CE3E56D2CCDAF05 /* undocumented.json */, - AC33CC64B00A81ECAA51CEA2D87FFB02 /* undocumented.json */, - AE86EF2D232EB2767663348789DB7E20 /* Utils.html */, - 700BC05FDF7692464A6DF678C5C4BD36 /* Utils.html */, - D9675BF7F1617547A197EF54B4CA5417 /* VerticalAlignment.html */, - 8A5227423FF6FE3204090D635C218B96 /* VerticalAlignment.html */, - 9FAFF822F7883772CCBBF785311B59CB /* VerticalHeightPreference.html */, - 7076BC194CEA96FECF3A5D9955B1F08C /* VerticalHeightPreference.html */, - 3A540063FC9B6D4937073EBE532CA784 /* VerticalLineView.html */, - BD75F5A5493A8BB2B944A36BC5A2670D /* VerticalLineView.html */, - CC69DB27C7C6E3F3799F1663B003A975 /* View.html */, - 49D784553AAC8B8E5FFC11DA327E51EA /* View.html */, - D91A7437B5D61C5D68DDF1F242E37954 /* WidthKey.html */, - 1D977FF5D1206DC3CAFF4E0B4515EA3E /* WidthKey.html */, - E2223A0FBBFB25BCAE60975D90CE7350 /* WidthPreference.html */, - 6E319680C2F4C653000270E83E310B89 /* WidthPreference.html */, - 5BB3FA8F800EAD771A887AA0B262E0A0 /* YellowSubType.html */, - 9143B1D54CE5419FADBDE2970AEFFBBB /* YellowSubType.html */, - ); - name = Pod; - sourceTree = ""; - }; - BF2DB2F84A96D65E083644EB762CC298 /* Views */ = { - isa = PBXGroup; - children = ( - 916AFA1F3CEADA5123AF42341C9C9E74 /* PitStopView.swift */, - 037A5F0BAD04B43C7E47A3A4B16A6604 /* StepIndicatorHorizontalView.swift */, - 0121FF4CEF26054F53A0AB4A72B5A077 /* StepIndicatorVerticalView.swift */, - 30808D73138CABEBE9E3BA4D4D205110 /* StepperView.swift */, - 1D6BC62242E7A714F53C7006099CCBBB /* Components */, - 93F0CEF623DECB20DA8A258F54F14284 /* Indicators */, - D65D223136D19C3D57CDCCD4C2D83B3E /* Lines */, - ); - name = Views; - path = Sources/StepperView/Views; - sourceTree = ""; - }; - CF1408CF629C7361332E53B88F7BD30C = { - isa = PBXGroup; - children = ( - 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, - F7C9785C08956CF4F019B49A8D44F9A8 /* Development Pods */, - 002FC2840F803E54F3467DE9608342BB /* Frameworks */, - A6070CAE37959EE37530D31A4CAD7008 /* Pods */, - 893236DF3AEB52A9326AA24F08665C25 /* Products */, - 6FC9AF4CEA617D29D9D2246CB9DCCBEA /* Targets Support Files */, - ); - sourceTree = ""; - }; - D65D223136D19C3D57CDCCD4C2D83B3E /* Lines */ = { - isa = PBXGroup; - children = ( - CD0367335418A9475527400CB190FA8B /* HorizontalLineView.swift */, - FA3F145C60CFFB10F1798BB55725230F /* PitStopLineView.swift */, - 230EA4B54F18F7F7B03EFA6DB15A64B4 /* VerticalLineView.swift */, - ); - path = Lines; - sourceTree = ""; - }; - DC653ED5AAEDAC56C2ED23C2834A0798 /* Extension */ = { - isa = PBXGroup; - children = ( - CDE7A9925C1CAC9A9869C3C58582C9EB /* Colors+Extension.swift */, - B01D516C6763F1B1F43B3A6786891218 /* EnvironmentValues+Extension.swift */, - 979CD95CCB2851EA30B74C797FB103B9 /* PreferenceKey+Extension.swift */, - 1FA8B71659D7F0DA0B54A1914619FC27 /* VerticalAlignment+Extension.swift */, - 8F7BA3A8661BBC806864F697C51D7318 /* View+Extensions.swift */, - ); - name = Extension; - path = Sources/StepperView/Extension; - sourceTree = ""; - }; - F5AC8741D5B561D93132F79A2669230E /* StepperView */ = { - isa = PBXGroup; - children = ( - DC653ED5AAEDAC56C2ED23C2834A0798 /* Extension */, - AFA4D17C2283C7B2B13DD6DE061BB3FF /* Pod */, - 2375A1C49CD4C01E3420161DD46134F5 /* Support Files */, - 539E5B6C767B836C59A82AD64850B766 /* Utils */, - BF2DB2F84A96D65E083644EB762CC298 /* Views */, - ); - name = StepperView; - path = ../..; - sourceTree = ""; - }; - F7C9785C08956CF4F019B49A8D44F9A8 /* Development Pods */ = { - isa = PBXGroup; - children = ( - F5AC8741D5B561D93132F79A2669230E /* StepperView */, - ); - name = "Development Pods"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 154164650BE3CC4D2233E29D9F87DE8A /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 59B68A9EDFFBFF6492AFFD82374857C5 /* Pods-StepperView_Tests-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 3E82DF666138DE33153F690018D56ACC /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 3D2859086A3653805783B3EE9F879664 /* Pods-StepperView_Watch Extension-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 79C0694819EF5C6D9F4B14250DA5461E /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 1A4448B14C94D38D7E0645F23C6C9C5C /* Pods-StepperView_Example-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 7C4D551FBC1B918D4E57BE13BD42B087 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 84432746DEB076256002FB7BABDAAAA5 /* SnapshotTesting-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - C51A2FEEA917F0394F82D38FB40FCE57 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 9800EFBFE483CD9E6471C03435320076 /* StepperView-watchOS-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DE696BC3400FE33EAE3CB984E51C65C1 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - EDCE614B02A5F7D181391CF81E599117 /* Pods-StepperView_Watch-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - FBF821B3027DDD3EF184043C7645E703 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 079B606CEAB9EE6D54A72C1C3FB4C21D /* StepperView-iOS-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 21145AEF94EFCE703A502F0420DD3E10 /* Pods-StepperView_Watch Extension */ = { - isa = PBXNativeTarget; - buildConfigurationList = 45B33967E7F1C950B38C1CA068D6481F /* Build configuration list for PBXNativeTarget "Pods-StepperView_Watch Extension" */; - buildPhases = ( - 3E82DF666138DE33153F690018D56ACC /* Headers */, - E01000321956C307EB4DFC996E0A702B /* Sources */, - 7B68B79D506F831E8850A41FC5D36691 /* Frameworks */, - 35D20BD0E47BB158B6371C4596AD104F /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 16E7DFF5383036C75BCDA934A83BCD0A /* PBXTargetDependency */, - ); - name = "Pods-StepperView_Watch Extension"; - productName = "Pods-StepperView_Watch Extension"; - productReference = F631A9742E4B7230AEBCE296A7A92738 /* Pods_StepperView_Watch_Extension.framework */; - productType = "com.apple.product-type.framework"; - }; - 3AA859A35A1114B15E4CC867026B10D2 /* StepperView-iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 15AFC0C317DEAD612987668599C6653E /* Build configuration list for PBXNativeTarget "StepperView-iOS" */; - buildPhases = ( - FBF821B3027DDD3EF184043C7645E703 /* Headers */, - 2735CBCCC078F1108EFE5DE9528CC97C /* Sources */, - 9707D226B941CAD34D16D1234AFB5475 /* Frameworks */, - ACEB47AAB137F311E9BF8086A17961D5 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "StepperView-iOS"; - productName = "StepperView-iOS"; - productReference = 8D321BF6212627F5C951843A9B28BB14 /* StepperView.framework */; - productType = "com.apple.product-type.framework"; - }; - 571CB0ABE2FA6FBE270E5779B73071A5 /* Pods-StepperView_Watch */ = { - isa = PBXNativeTarget; - buildConfigurationList = 950A883E7B02AB5B9A628F659535A977 /* Build configuration list for PBXNativeTarget "Pods-StepperView_Watch" */; - buildPhases = ( - DE696BC3400FE33EAE3CB984E51C65C1 /* Headers */, - D4738DF80872437C9712C106E306B811 /* Sources */, - 1AF852CD197E8669183F54DC80E247B7 /* Frameworks */, - 7CD798C5CD1C99A2F3751C7EF71AD48D /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 6EF9440C07DD3C5CD138773363D40456 /* PBXTargetDependency */, - ); - name = "Pods-StepperView_Watch"; - productName = "Pods-StepperView_Watch"; - productReference = 3F67E7AC212DABDF49FEC3651669CA0A /* Pods_StepperView_Watch.framework */; - productType = "com.apple.product-type.framework"; - }; - ADEAE7CDD604DE4F3072E6021A314487 /* SnapshotTesting */ = { - isa = PBXNativeTarget; - buildConfigurationList = 32867542F50A9BE9FCBEA5DBF1117399 /* Build configuration list for PBXNativeTarget "SnapshotTesting" */; - buildPhases = ( - 7C4D551FBC1B918D4E57BE13BD42B087 /* Headers */, - 986B2299F460A09ADA1304C267ED03D8 /* Sources */, - A3753966D6558AC3D7EB88C394F87259 /* Frameworks */, - 1905CD6CFCB44CBB91511667E74D0AFB /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = SnapshotTesting; - productName = SnapshotTesting; - productReference = A037DBBCCACBFACB5C39A80B1C273043 /* SnapshotTesting.framework */; - productType = "com.apple.product-type.framework"; - }; - B0320FC3B1A206B0507A9D6244BBAD62 /* Pods-StepperView_Tests */ = { - isa = PBXNativeTarget; - buildConfigurationList = C3E909516F5A97A70148AF7FD422ED23 /* Build configuration list for PBXNativeTarget "Pods-StepperView_Tests" */; - buildPhases = ( - 154164650BE3CC4D2233E29D9F87DE8A /* Headers */, - E97BA4BADE7FACB534F9DF3BA566E44C /* Sources */, - 99A7B224992038A9BC53EABC3D72694B /* Frameworks */, - D1FF3C2118AA7F5FF3BD698E37E31812 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - EDC00807857FFB9D042A54D183E08166 /* PBXTargetDependency */, - 4ED1470FEC2369CB9F780B05C61B5761 /* PBXTargetDependency */, - ); - name = "Pods-StepperView_Tests"; - productName = "Pods-StepperView_Tests"; - productReference = 4EA5DAFB8EA20FA670B63AC5FCD0523C /* Pods_StepperView_Tests.framework */; - productType = "com.apple.product-type.framework"; - }; - DBF79473512C18725EF567DC3C660B7D /* Pods-StepperView_Example */ = { - isa = PBXNativeTarget; - buildConfigurationList = CE11EB150DA775D84218375381303B70 /* Build configuration list for PBXNativeTarget "Pods-StepperView_Example" */; - buildPhases = ( - 79C0694819EF5C6D9F4B14250DA5461E /* Headers */, - 23BDA0064B9FBF9C540D14172E452CE7 /* Sources */, - FE91C3DE35F2558A7A542ADE2EEF94D9 /* Frameworks */, - 56B6210CC4315A845D2B6ACB4F15172D /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 63E6070F15D491F713925F82E6E49A01 /* PBXTargetDependency */, - ); - name = "Pods-StepperView_Example"; - productName = "Pods-StepperView_Example"; - productReference = 05C028F74B9508FE72717D3BB2BD7B7A /* Pods_StepperView_Example.framework */; - productType = "com.apple.product-type.framework"; - }; - E5C4FE1324F54F73C9F9F6B19D0A98B7 /* StepperView-watchOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = 6114B62E979317B5D54F39BF6D25B34D /* Build configuration list for PBXNativeTarget "StepperView-watchOS" */; - buildPhases = ( - C51A2FEEA917F0394F82D38FB40FCE57 /* Headers */, - 78541D9E2E74D5177C265099F43C4572 /* Sources */, - 9E6D64D3BD4FFA53A5380CBA763579B3 /* Frameworks */, - E240BBF056DEA84020A18ECE05836299 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "StepperView-watchOS"; - productName = "StepperView-watchOS"; - productReference = 1E35132387A01BF6418B815210B677B4 /* StepperView.framework */; - productType = "com.apple.product-type.framework"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - BFDFE7DC352907FC980B868725387E98 /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 1100; - LastUpgradeCheck = 1100; - }; - buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = CF1408CF629C7361332E53B88F7BD30C; - productRefGroup = 893236DF3AEB52A9326AA24F08665C25 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - DBF79473512C18725EF567DC3C660B7D /* Pods-StepperView_Example */, - B0320FC3B1A206B0507A9D6244BBAD62 /* Pods-StepperView_Tests */, - 571CB0ABE2FA6FBE270E5779B73071A5 /* Pods-StepperView_Watch */, - 21145AEF94EFCE703A502F0420DD3E10 /* Pods-StepperView_Watch Extension */, - ADEAE7CDD604DE4F3072E6021A314487 /* SnapshotTesting */, - 3AA859A35A1114B15E4CC867026B10D2 /* StepperView-iOS */, - E5C4FE1324F54F73C9F9F6B19D0A98B7 /* StepperView-watchOS */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 1905CD6CFCB44CBB91511667E74D0AFB /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 35D20BD0E47BB158B6371C4596AD104F /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 56B6210CC4315A845D2B6ACB4F15172D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 7CD798C5CD1C99A2F3751C7EF71AD48D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - ACEB47AAB137F311E9BF8086A17961D5 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D1FF3C2118AA7F5FF3BD698E37E31812 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - E240BBF056DEA84020A18ECE05836299 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 23BDA0064B9FBF9C540D14172E452CE7 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 52D653F555B9F1C7FC3C64225385AB49 /* Pods-StepperView_Example-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 2735CBCCC078F1108EFE5DE9528CC97C /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5AE04565525B28FB2A47DBA747A066FE /* CircledIconView.swift in Sources */, - 45CA33196B9B2E32EBC05C1D89745ABE /* Colors+Extension.swift in Sources */, - A8C3F883A619481C44145C3BAA9E3B81 /* EnvironmentValues+Extension.swift in Sources */, - 4489D243110E804DD140DC4E51ADB764 /* HorizontalLineView.swift in Sources */, - AFEA48DB6BBE208C407FB0C4C59F49A8 /* IndicatorView.swift in Sources */, - 94B3960AAECDFF0856E0301C370C9EE6 /* LoadingTimer.swift in Sources */, - F5C10090D5CC8AABC64DD17E69B56DE6 /* NumberedCircleView.swift in Sources */, - 5676F834482B032FB80B1D4A65906581 /* PitStopLineView.swift in Sources */, - B551120ADB2A47593DB465CB7AB87459 /* PitStopView.swift in Sources */, - AF0A952BC098616D0239E09CD43A0A88 /* PreferenceKey+Extension.swift in Sources */, - 4C1EABA32EF0C7ED0D0AFD0D7F11DBB9 /* StepIndicatorHorizontalView.swift in Sources */, - F79F97A1606023C4F2466173282A44E5 /* StepIndicatorVerticalView.swift in Sources */, - 795BD6F360D43281D50C9C50F5B88CAC /* StepperView-iOS-dummy.m in Sources */, - 6FECEB02C121C70F0952E69020456077 /* StepperView.swift in Sources */, - 772CC8FA4E8C3EE5230F2E9145A1F018 /* TextView.swift in Sources */, - D27A05C330322B61C35FFA59583FC02B /* Utils.swift in Sources */, - 7678DA5431588316E3EBC82767FD8F4E /* VerticalAlignment+Extension.swift in Sources */, - B55C1A68F67B9586B4719651D1CDD722 /* VerticalLineView.swift in Sources */, - ACD1023635AD860C09E6F90B54F21EAE /* View+Extensions.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 78541D9E2E74D5177C265099F43C4572 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 21E74A56ED4F23FC9F7AF3BE88BB6E84 /* CircledIconView.swift in Sources */, - 8B8A6A8258EFF349E0B25790AA7E6E70 /* Colors+Extension.swift in Sources */, - 73F64D790A6E3DE84E5AA93667008A63 /* EnvironmentValues+Extension.swift in Sources */, - 25FB3C2B4670C1CA6F5574947BECE595 /* HorizontalLineView.swift in Sources */, - DC63B1671C8EF376AAAA8F93FB3DE648 /* IndicatorView.swift in Sources */, - 9AFD35BFCAB02350ABB8761DCA6F6ED9 /* LoadingTimer.swift in Sources */, - E844B9143166940B1EB3BDA4D2BDD67B /* NumberedCircleView.swift in Sources */, - 6E6BFA34D92DE75FF0A1F7B2375FDE7B /* PitStopLineView.swift in Sources */, - C9E62123C70242796F6965C67FFD0605 /* PitStopView.swift in Sources */, - 28F64C016F8AA890227ED7CCE698C69D /* PreferenceKey+Extension.swift in Sources */, - 7F62B87D80190474F059EF98599B172C /* StepIndicatorHorizontalView.swift in Sources */, - 977C39038CBE4E53BE92B975EAAE55BC /* StepIndicatorVerticalView.swift in Sources */, - 8E5CA5266FE64ADD3EACE402B99AD43F /* StepperView-watchOS-dummy.m in Sources */, - 87C838CFDD1157225A54C7C23D7B812A /* StepperView.swift in Sources */, - 9AA06A732423614C1594CDAE07C6B6D0 /* TextView.swift in Sources */, - B04C2EA06B68C1B65396463AD6F616F2 /* Utils.swift in Sources */, - 6E1925DDCD0C3929ED558F7198788B2B /* VerticalAlignment+Extension.swift in Sources */, - D61CF48A3DEC55CC34637130BBFB48EA /* VerticalLineView.swift in Sources */, - 01EAFFC57329D2A990A377903960DFD1 /* View+Extensions.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 986B2299F460A09ADA1304C267ED03D8 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 14CC16A84D0558FF9DC6927E1BA82F02 /* Any.swift in Sources */, - 46B2A4686C72C29C24576FC6FF56A7BE /* AssertInlineSnapshot.swift in Sources */, - 18ED84EFAF015095FCCF61A8E494F325 /* AssertSnapshot.swift in Sources */, - AA6612CD34134596239652A299AC0F76 /* Async.swift in Sources */, - 67C39A754A360A5EFC7FE0037CECE5C3 /* CALayer.swift in Sources */, - 23B3D1B39D273F7B43BA45F255EDE5C5 /* CaseIterable.swift in Sources */, - A455E5B77A019CEAEEA0F9D26B1B74E6 /* Codable.swift in Sources */, - BDFAF00F9FE360EAFD864F290030A2D0 /* Data.swift in Sources */, - 11F2134521037184F745C9010217B501 /* Description.swift in Sources */, - 4E5AA162D02372A80FABE033AD6BFFE6 /* Diff.swift in Sources */, - 440314FEC8EC90F865D8D20910989A69 /* Diffing.swift in Sources */, - C2B818BE2E57EF9A8CE51775FCB33C2B /* Internal.swift in Sources */, - BE068F001E2344449F6E193DFB12B1D1 /* NSImage.swift in Sources */, - 1A1F20E176923FF03A0EAEA886703719 /* NSView.swift in Sources */, - 29F37DB8A1899894CA87E8E8381E2C11 /* NSViewController.swift in Sources */, - 8CD5CB3FDF05526DBF034B61F696BA93 /* PlistEncoder.swift in Sources */, - 4F03BBCA0FCF5903B46F72BE0BADDF34 /* SceneKit.swift in Sources */, - B04CA17471143BEDA50779BE9660BD2A /* SnapshotTestCase.swift in Sources */, - D6A43851802E3E81CF23D65CA9A81E4E /* SnapshotTesting-dummy.m in Sources */, - 57244463125C60529B7391F9FA3052AD /* Snapshotting.swift in Sources */, - 509FAAD85506B9E1BCCA50505B8C93DB /* SpriteKit.swift in Sources */, - 33432CD4B8F83F0C678B5C67CAF13414 /* String+SpecialCharacters.swift in Sources */, - D56563764E24224FB95BC77EC18F7D9E /* String.swift in Sources */, - 2371CFDF095282B1D6935C36C81E46FC /* UIImage.swift in Sources */, - 56B2D76BD27EAA69A1BED0113B7F9F51 /* UIView.swift in Sources */, - 8E1FBD13A74F689CFC06054841BFC596 /* UIViewController.swift in Sources */, - 6658F9FE5EEFD579907F946DD9FDD8E3 /* URLRequest.swift in Sources */, - 01757E29DF92738C1D5D0528F1EB4824 /* View.swift in Sources */, - 8003323F07F7A6F822902979CE092B88 /* Wait.swift in Sources */, - FDAD70506FFFD578C1327E64876A08E3 /* XCTAttachment.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - D4738DF80872437C9712C106E306B811 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - BCF7F0E6DDD930788B549D7C8E63EFE8 /* Pods-StepperView_Watch-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - E01000321956C307EB4DFC996E0A702B /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 4BE5BCCB3A39A09E538390A7F1972848 /* Pods-StepperView_Watch Extension-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - E97BA4BADE7FACB534F9DF3BA566E44C /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - F9D908B492555B2CCE640A685FF599BC /* Pods-StepperView_Tests-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 16E7DFF5383036C75BCDA934A83BCD0A /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "StepperView-watchOS"; - target = E5C4FE1324F54F73C9F9F6B19D0A98B7 /* StepperView-watchOS */; - targetProxy = C147C98286565B5F847EF55CE1B39A36 /* PBXContainerItemProxy */; - }; - 4ED1470FEC2369CB9F780B05C61B5761 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = SnapshotTesting; - target = ADEAE7CDD604DE4F3072E6021A314487 /* SnapshotTesting */; - targetProxy = 84F74D010F1D281A2C1E2A3B64EDFEB6 /* PBXContainerItemProxy */; - }; - 63E6070F15D491F713925F82E6E49A01 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "StepperView-iOS"; - target = 3AA859A35A1114B15E4CC867026B10D2 /* StepperView-iOS */; - targetProxy = FCCB94B9641D2BAAF9328F29E5E4717D /* PBXContainerItemProxy */; - }; - 6EF9440C07DD3C5CD138773363D40456 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "StepperView-watchOS"; - target = E5C4FE1324F54F73C9F9F6B19D0A98B7 /* StepperView-watchOS */; - targetProxy = 5AA9A90CA687129DBA01336F2483462B /* PBXContainerItemProxy */; - }; - EDC00807857FFB9D042A54D183E08166 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "Pods-StepperView_Example"; - target = DBF79473512C18725EF567DC3C660B7D /* Pods-StepperView_Example */; - targetProxy = 77E964D150AA101D4C22BE9A244CCA0E /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 17AAF92676D9AB2D5BD95CD3AF05E28C /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 353AACBC0866DF85C19BF4739696B13D /* Pods-StepperView_Watch.debug.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - "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-StepperView_Watch/Pods-StepperView_Watch-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-StepperView_Watch/Pods-StepperView_Watch.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = watchos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - WATCHOS_DEPLOYMENT_TARGET = 6.1; - }; - name = Debug; - }; - 2D9B362C2899999F77416B27CC501FDB /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = EA4CE37FD5420F6CA4CF69FAAF170DA5 /* StepperView-watchOS.debug.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - "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/StepperView-watchOS/StepperView-watchOS-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/StepperView-watchOS/StepperView-watchOS-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/StepperView-watchOS/StepperView-watchOS.modulemap"; - PRODUCT_MODULE_NAME = StepperView; - PRODUCT_NAME = StepperView; - SDKROOT = watchos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 4; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - WATCHOS_DEPLOYMENT_TARGET = 6.0; - }; - name = Debug; - }; - 3B2344F3302B5CE2C77D9E48237B1CB8 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8D819FD4CFE2D9AE1135737C473BB56E /* Pods-StepperView_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-StepperView_Example/Pods-StepperView_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"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-StepperView_Example/Pods-StepperView_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; - }; - 4E3AF1DBC35C8873238E39F594FDBBA4 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 314A21CD4CA38212B1C9361BB856ED68 /* 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 = 10.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; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.1.2; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 732FB30E47B6B4BFA4F9C75C54E472EB /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 6CEE61257AE2E38506BEBD035401EBF7 /* Pods-StepperView_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-StepperView_Example/Pods-StepperView_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"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-StepperView_Example/Pods-StepperView_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; - }; - 927A464B835D77B39E9C10E7B4D133E7 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 6166C4D659B8007CAA7ACDFDAB709A46 /* StepperView-iOS.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/StepperView-iOS/StepperView-iOS-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/StepperView-iOS/StepperView-iOS-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/StepperView-iOS/StepperView-iOS.modulemap"; - PRODUCT_MODULE_NAME = StepperView; - PRODUCT_NAME = StepperView; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - A8628C4BF6F4ED31C3EE01E12A6553B4 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 44E083363A4248B2AE63427EE12EBE61 /* Pods-StepperView_Watch Extension.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - "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-StepperView_Watch Extension/Pods-StepperView_Watch Extension-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-StepperView_Watch Extension/Pods-StepperView_Watch Extension.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = watchos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - WATCHOS_DEPLOYMENT_TARGET = 6.1; - }; - name = Release; - }; - AAF31B9A9D1BD098118AA34CF4310306 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_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 = ( - "POD_CONFIGURATION_DEBUG=1", - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - STRIP_INSTALLED_PRODUCT = NO; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; - SYMROOT = "${SRCROOT}/../build"; - WATCHOS_DEPLOYMENT_TARGET = 6.1; - }; - name = Debug; - }; - B2F04363C4C412BB4C208F442760F57D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 2E2CA03B708D8424B73A38D4C8C250F5 /* SnapshotTesting.debug.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 = 10.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; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.1.2; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - C9B16024E944761BC030AD9DB2027F5C /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_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_PREPROCESSOR_DEFINITIONS = ( - "POD_CONFIGURATION_RELEASE=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - PRODUCT_NAME = "$(TARGET_NAME)"; - STRIP_INSTALLED_PRODUCT = NO; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 5.0; - SYMROOT = "${SRCROOT}/../build"; - WATCHOS_DEPLOYMENT_TARGET = 6.1; - }; - name = Release; - }; - D89B52CA80F7F5C687E1D982B8EBB710 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9E84FD3EAE223A68314E7E7E878F3581 /* StepperView-watchOS.release.xcconfig */; - buildSettings = { - APPLICATION_EXTENSION_API_ONLY = YES; - "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/StepperView-watchOS/StepperView-watchOS-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/StepperView-watchOS/StepperView-watchOS-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MODULEMAP_FILE = "Target Support Files/StepperView-watchOS/StepperView-watchOS.modulemap"; - PRODUCT_MODULE_NAME = StepperView; - PRODUCT_NAME = StepperView; - SDKROOT = watchos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = 4; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - WATCHOS_DEPLOYMENT_TARGET = 6.0; - }; - name = Release; - }; - E010E301AA8FF78823ED16FFE1DB6413 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 56DB778555062E61C5669596213B83F1 /* Pods-StepperView_Watch Extension.debug.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - "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-StepperView_Watch Extension/Pods-StepperView_Watch Extension-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-StepperView_Watch Extension/Pods-StepperView_Watch Extension.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = watchos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - WATCHOS_DEPLOYMENT_TARGET = 6.1; - }; - name = Debug; - }; - E257961F34D7294DBDA037748F3CDFB4 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 0B1AF4EE96053C3B0D8314A16AAA6B2E /* Pods-StepperView_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-StepperView_Tests/Pods-StepperView_Tests-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-StepperView_Tests/Pods-StepperView_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; - }; - E50BDE646645BC6F0A935143AFFF0AC0 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 51F952AD7FE401BD0C8D99835194E95D /* StepperView-iOS.debug.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/StepperView-iOS/StepperView-iOS-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/StepperView-iOS/StepperView-iOS-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/StepperView-iOS/StepperView-iOS.modulemap"; - PRODUCT_MODULE_NAME = StepperView; - PRODUCT_NAME = StepperView; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - F4CD9C45C3BC1F1D23C96A76BE1F0B45 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 21FA315ABE27D7DE0FD7B793A4222387 /* Pods-StepperView_Tests.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-StepperView_Tests/Pods-StepperView_Tests-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-StepperView_Tests/Pods-StepperView_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; - }; - FAB963FDF4BB519DB8232FE7B2AD513D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = C359AED391F6ADA8E24CD9A124DA371E /* Pods-StepperView_Watch.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; - APPLICATION_EXTENSION_API_ONLY = YES; - "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-StepperView_Watch/Pods-StepperView_Watch-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - MACH_O_TYPE = staticlib; - MODULEMAP_FILE = "Target Support Files/Pods-StepperView_Watch/Pods-StepperView_Watch.modulemap"; - OTHER_LDFLAGS = ""; - OTHER_LIBTOOLFLAGS = ""; - PODS_ROOT = "$(SRCROOT)"; - PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SDKROOT = watchos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = 4; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - WATCHOS_DEPLOYMENT_TARGET = 6.1; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 15AFC0C317DEAD612987668599C6653E /* Build configuration list for PBXNativeTarget "StepperView-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - E50BDE646645BC6F0A935143AFFF0AC0 /* Debug */, - 927A464B835D77B39E9C10E7B4D133E7 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 32867542F50A9BE9FCBEA5DBF1117399 /* Build configuration list for PBXNativeTarget "SnapshotTesting" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - B2F04363C4C412BB4C208F442760F57D /* Debug */, - 4E3AF1DBC35C8873238E39F594FDBBA4 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 45B33967E7F1C950B38C1CA068D6481F /* Build configuration list for PBXNativeTarget "Pods-StepperView_Watch Extension" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - E010E301AA8FF78823ED16FFE1DB6413 /* Debug */, - A8628C4BF6F4ED31C3EE01E12A6553B4 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - AAF31B9A9D1BD098118AA34CF4310306 /* Debug */, - C9B16024E944761BC030AD9DB2027F5C /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 6114B62E979317B5D54F39BF6D25B34D /* Build configuration list for PBXNativeTarget "StepperView-watchOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 2D9B362C2899999F77416B27CC501FDB /* Debug */, - D89B52CA80F7F5C687E1D982B8EBB710 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 950A883E7B02AB5B9A628F659535A977 /* Build configuration list for PBXNativeTarget "Pods-StepperView_Watch" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 17AAF92676D9AB2D5BD95CD3AF05E28C /* Debug */, - FAB963FDF4BB519DB8232FE7B2AD513D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - C3E909516F5A97A70148AF7FD422ED23 /* Build configuration list for PBXNativeTarget "Pods-StepperView_Tests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - F4CD9C45C3BC1F1D23C96A76BE1F0B45 /* Debug */, - E257961F34D7294DBDA037748F3CDFB4 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - CE11EB150DA775D84218375381303B70 /* Build configuration list for PBXNativeTarget "Pods-StepperView_Example" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 3B2344F3302B5CE2C77D9E48237B1CB8 /* Debug */, - 732FB30E47B6B4BFA4F9C75C54E472EB /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; -} diff --git a/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/StepperView.xcscheme b/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/StepperView.xcscheme deleted file mode 100644 index 566d786..0000000 --- a/Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/StepperView.xcscheme +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - 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 95a200b..0000000 --- a/Example/Pods/SnapshotTesting/README.md +++ /dev/null @@ -1,240 +0,0 @@ -# 📸 SnapshotTesting - -[![Swift 5.1](https://img.shields.io/badge/swift-5.1-ED523F.svg?style=flat)](https://swift.org/download/) -[![Build Status](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2Fpointfreeco%2Fswift-snapshot-testing%2Fbadge&style=flat)](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. - -You can record a new reference by setting the `record` mode to `true` on the assertion or globally. - -``` swift -assertSnapshot(matching: vc, as: .image, record: true) - -// or globally - -record = 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 targets. Please _uncheck_ SnapshotTesting in the final step of adding a Swift package to your target, as documented below. - - 1. From the **File** menu, navigate through **Swift Packages** and select **Add Package Dependency…**. - 2. Enter package respository URL: `https://github.com/pointfreeco/swift-snapshot-testing.git` - 3. Confirm the version and let Xcode resolve the package - 4. On the final dialog, _uncheck_ any box that adds the SnapshotTesting package to any target - -### 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(url: "https://github.com/pointfreeco/swift-snapshot-testing.git", from: "1.7.2"), -] -``` - -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.7.2 -``` - -> ⚠️ 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.7.2' -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 `record` 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). - -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://github.com/mbrandonw) and [Stephen Celis](https://github.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 86642df..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/AssertInlineSnapshot.swift +++ /dev/null @@ -1,319 +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 || record - - 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" - 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 39e1337..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/AssertSnapshot.swift +++ /dev/null @@ -1,291 +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 record = false - -/// 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: An dictionnay 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 || record - - 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" - case .incorrectOrder, .invertedFulfillment, .interrupted: - return "Couldn't snapshot value" - @unknown default: - return "Couldn't snapshot value" - } - - guard let 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) - - 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 908a39f..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Common/View.swift +++ /dev/null @@ -1,843 +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() - ) - #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) || 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 { - 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(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) -func prepareView( - config: ViewImageConfig, - drawHierarchyInKeyWindow: Bool, - traits: UITraitCollection, - view: UIView, - viewController: UIViewController - ) { - 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 = UIApplication.shared.keyWindow 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 - ) - } - 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() - } - - guard view.frame.size.width > 0, view.frame.size.height > 0 else { - fatalError("View not renderable to image at size \(size)") - } -} - -func snapshotView( - config: ViewImageConfig, - drawHierarchyInKeyWindow: Bool, - traits: UITraitCollection, - view: UIView, - viewController: UIViewController - ) - -> Async { - let initialFrame = view.frame - 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 - } - } -} - -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) { - let rootViewController = UIViewController() - rootViewController.view.backgroundColor = .clear - rootViewController.view.frame = window.frame - rootViewController.view.translatesAutoresizingMaskIntoConstraints = - viewController.view.translatesAutoresizingMaskIntoConstraints - rootViewController.preferredContentSize = rootViewController.view.frame.size - - rootViewController.addChild(viewController) - 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.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() -} - -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 3d835a3..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 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 200c76d..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).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/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 6d52049..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 { - 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/NSImage.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/NSImage.swift deleted file mode 100644 index 9dd7a4e..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/NSImage.swift +++ /dev/null @@ -1,123 +0,0 @@ -#if os(macOS) -import Cocoa -import XCTest - -extension Diffing where Value == NSImage { - /// A pixel-diffing strategy for NSImage's which requires a 100% match. - public static let image = Diffing.image(precision: 1) - - /// A pixel-diffing strategy for NSImage 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. - /// - Returns: A new diffing strategy. - public static func image(precision: Float) -> 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 - for x in 0.. 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/UIImage.swift b/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/UIImage.swift deleted file mode 100644 index 54820b1..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/UIImage.swift +++ /dev/null @@ -1,120 +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) - - /// 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. - /// - Returns: A new diffing strategy. - public static func image(precision: Float) -> Diffing { - return Diffing( - toData: { $0.pngData()! }, - fromData: { UIImage(data: $0, scale: UIScreen.main.scale)! } - ) { 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] - ) - } - } -} - -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) - } - - /// 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 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 011a0f2..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/UIView.swift +++ /dev/null @@ -1,64 +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).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 - prepareView( - config: .init(safeArea: .zero, size: size ?? view.frame.size, traits: traits), - drawHierarchyInKeyWindow: false, - traits: .init(), - view: view, - viewController: .init() - ) - 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 e4e7492..0000000 --- a/Example/Pods/SnapshotTesting/Sources/SnapshotTesting/Snapshotting/UIViewController.swift +++ /dev/null @@ -1,112 +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).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).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 - prepareView( - config: .init(), - drawHierarchyInKeyWindow: false, - traits: .init(), - view: viewController.view, - viewController: viewController - ) - 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 - prepareView( - config: .init(safeArea: config.safeArea, size: size ?? config.size, traits: config.traits), - drawHierarchyInKeyWindow: false, - traits: .init(), - view: viewController.view, - viewController: viewController - ) - 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-StepperView_Example/Pods-StepperView_Example-Info.plist b/Example/Pods/Target Support Files/Pods-StepperView_Example/Pods-StepperView_Example-Info.plist deleted file mode 100644 index 2243fe6..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Example/Pods-StepperView_Example-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-StepperView_Example/Pods-StepperView_Example-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-StepperView_Example/Pods-StepperView_Example-acknowledgements.markdown deleted file mode 100644 index c55c9ab..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Example/Pods-StepperView_Example-acknowledgements.markdown +++ /dev/null @@ -1,26 +0,0 @@ -# Acknowledgements -This application makes use of the following third party libraries: - -## StepperView - -Copyright (c) 2020 Badarinath Venkatnarayansetty - -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-StepperView_Example/Pods-StepperView_Example-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-StepperView_Example/Pods-StepperView_Example-acknowledgements.plist deleted file mode 100644 index db25d8f..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Example/Pods-StepperView_Example-acknowledgements.plist +++ /dev/null @@ -1,58 +0,0 @@ - - - - - PreferenceSpecifiers - - - FooterText - This application makes use of the following third party libraries: - Title - Acknowledgements - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2020 Badarinath Venkatnarayansetty <badrinathvm@gmail.com> - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - License - MIT - Title - StepperView - 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-StepperView_Example/Pods-StepperView_Example-dummy.m b/Example/Pods/Target Support Files/Pods-StepperView_Example/Pods-StepperView_Example-dummy.m deleted file mode 100644 index 4c1eade..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Example/Pods-StepperView_Example-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_StepperView_Example : NSObject -@end -@implementation PodsDummy_Pods_StepperView_Example -@end diff --git a/Example/Pods/Target Support Files/Pods-StepperView_Example/Pods-StepperView_Example-frameworks.sh b/Example/Pods/Target Support Files/Pods-StepperView_Example/Pods-StepperView_Example-frameworks.sh deleted file mode 100755 index 169f9da..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Example/Pods-StepperView_Example-frameworks.sh +++ /dev/null @@ -1,185 +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. - 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}/StepperView-iOS/StepperView.framework" -fi -if [[ "$CONFIGURATION" == "Release" ]]; then - install_framework "${BUILT_PRODUCTS_DIR}/StepperView-iOS/StepperView.framework" -fi -if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then - wait -fi diff --git a/Example/Pods/Target Support Files/Pods-StepperView_Example/Pods-StepperView_Example-umbrella.h b/Example/Pods/Target Support Files/Pods-StepperView_Example/Pods-StepperView_Example-umbrella.h deleted file mode 100644 index a294fe0..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Example/Pods-StepperView_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_StepperView_ExampleVersionNumber; -FOUNDATION_EXPORT const unsigned char Pods_StepperView_ExampleVersionString[]; - diff --git a/Example/Pods/Target Support Files/Pods-StepperView_Example/Pods-StepperView_Example.debug.xcconfig b/Example/Pods/Target Support Files/Pods-StepperView_Example/Pods-StepperView_Example.debug.xcconfig deleted file mode 100644 index ab17863..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Example/Pods-StepperView_Example.debug.xcconfig +++ /dev/null @@ -1,14 +0,0 @@ -ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/StepperView-iOS" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/StepperView-iOS/StepperView.framework/Headers" -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_LDFLAGS = $(inherited) -framework "StepperView" -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-StepperView_Example/Pods-StepperView_Example.modulemap b/Example/Pods/Target Support Files/Pods-StepperView_Example/Pods-StepperView_Example.modulemap deleted file mode 100644 index 89781f6..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Example/Pods-StepperView_Example.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module Pods_StepperView_Example { - umbrella header "Pods-StepperView_Example-umbrella.h" - - export * - module * { export * } -} diff --git a/Example/Pods/Target Support Files/Pods-StepperView_Example/Pods-StepperView_Example.release.xcconfig b/Example/Pods/Target Support Files/Pods-StepperView_Example/Pods-StepperView_Example.release.xcconfig deleted file mode 100644 index ab17863..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Example/Pods-StepperView_Example.release.xcconfig +++ /dev/null @@ -1,14 +0,0 @@ -ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/StepperView-iOS" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/StepperView-iOS/StepperView.framework/Headers" -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_LDFLAGS = $(inherited) -framework "StepperView" -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-StepperView_Tests/Pods-StepperView_Tests-Info.plist b/Example/Pods/Target Support Files/Pods-StepperView_Tests/Pods-StepperView_Tests-Info.plist deleted file mode 100644 index 2243fe6..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Tests/Pods-StepperView_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-StepperView_Tests/Pods-StepperView_Tests-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-StepperView_Tests/Pods-StepperView_Tests-acknowledgements.markdown deleted file mode 100644 index 339c3a6..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Tests/Pods-StepperView_Tests-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-StepperView_Tests/Pods-StepperView_Tests-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-StepperView_Tests/Pods-StepperView_Tests-acknowledgements.plist deleted file mode 100644 index 9ce1936..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Tests/Pods-StepperView_Tests-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-StepperView_Tests/Pods-StepperView_Tests-dummy.m b/Example/Pods/Target Support Files/Pods-StepperView_Tests/Pods-StepperView_Tests-dummy.m deleted file mode 100644 index 9d59c4c..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Tests/Pods-StepperView_Tests-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_StepperView_Tests : NSObject -@end -@implementation PodsDummy_Pods_StepperView_Tests -@end diff --git a/Example/Pods/Target Support Files/Pods-StepperView_Tests/Pods-StepperView_Tests-frameworks.sh b/Example/Pods/Target Support Files/Pods-StepperView_Tests/Pods-StepperView_Tests-frameworks.sh deleted file mode 100755 index a03bfc5..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Tests/Pods-StepperView_Tests-frameworks.sh +++ /dev/null @@ -1,185 +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. - 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-StepperView_Tests/Pods-StepperView_Tests-umbrella.h b/Example/Pods/Target Support Files/Pods-StepperView_Tests/Pods-StepperView_Tests-umbrella.h deleted file mode 100644 index ea62944..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Tests/Pods-StepperView_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_StepperView_TestsVersionNumber; -FOUNDATION_EXPORT const unsigned char Pods_StepperView_TestsVersionString[]; - diff --git a/Example/Pods/Target Support Files/Pods-StepperView_Tests/Pods-StepperView_Tests.debug.xcconfig b/Example/Pods/Target Support Files/Pods-StepperView_Tests/Pods-StepperView_Tests.debug.xcconfig deleted file mode 100644 index 29ddd19..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Tests/Pods-StepperView_Tests.debug.xcconfig +++ /dev/null @@ -1,15 +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}/SnapshotTesting" "${PODS_CONFIGURATION_BUILD_DIR}/StepperView-iOS" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SnapshotTesting/SnapshotTesting.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/StepperView-iOS/StepperView.framework/Headers" -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -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 "SnapshotTesting" -framework "StepperView" -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-StepperView_Tests/Pods-StepperView_Tests.modulemap b/Example/Pods/Target Support Files/Pods-StepperView_Tests/Pods-StepperView_Tests.modulemap deleted file mode 100644 index ac18e63..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Tests/Pods-StepperView_Tests.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module Pods_StepperView_Tests { - umbrella header "Pods-StepperView_Tests-umbrella.h" - - export * - module * { export * } -} diff --git a/Example/Pods/Target Support Files/Pods-StepperView_Tests/Pods-StepperView_Tests.release.xcconfig b/Example/Pods/Target Support Files/Pods-StepperView_Tests/Pods-StepperView_Tests.release.xcconfig deleted file mode 100644 index 29ddd19..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Tests/Pods-StepperView_Tests.release.xcconfig +++ /dev/null @@ -1,15 +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}/SnapshotTesting" "${PODS_CONFIGURATION_BUILD_DIR}/StepperView-iOS" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/SnapshotTesting/SnapshotTesting.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/StepperView-iOS/StepperView.framework/Headers" -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -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 "SnapshotTesting" -framework "StepperView" -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-StepperView_Watch Extension/Pods-StepperView_Watch Extension-Info.plist b/Example/Pods/Target Support Files/Pods-StepperView_Watch Extension/Pods-StepperView_Watch Extension-Info.plist deleted file mode 100644 index 2243fe6..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Watch Extension/Pods-StepperView_Watch Extension-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-StepperView_Watch Extension/Pods-StepperView_Watch Extension-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-StepperView_Watch Extension/Pods-StepperView_Watch Extension-acknowledgements.markdown deleted file mode 100644 index c55c9ab..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Watch Extension/Pods-StepperView_Watch Extension-acknowledgements.markdown +++ /dev/null @@ -1,26 +0,0 @@ -# Acknowledgements -This application makes use of the following third party libraries: - -## StepperView - -Copyright (c) 2020 Badarinath Venkatnarayansetty - -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-StepperView_Watch Extension/Pods-StepperView_Watch Extension-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-StepperView_Watch Extension/Pods-StepperView_Watch Extension-acknowledgements.plist deleted file mode 100644 index db25d8f..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Watch Extension/Pods-StepperView_Watch Extension-acknowledgements.plist +++ /dev/null @@ -1,58 +0,0 @@ - - - - - PreferenceSpecifiers - - - FooterText - This application makes use of the following third party libraries: - Title - Acknowledgements - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2020 Badarinath Venkatnarayansetty <badrinathvm@gmail.com> - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - License - MIT - Title - StepperView - 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-StepperView_Watch Extension/Pods-StepperView_Watch Extension-dummy.m b/Example/Pods/Target Support Files/Pods-StepperView_Watch Extension/Pods-StepperView_Watch Extension-dummy.m deleted file mode 100644 index 9ca4aeb..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Watch Extension/Pods-StepperView_Watch Extension-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_StepperView_Watch_Extension : NSObject -@end -@implementation PodsDummy_Pods_StepperView_Watch_Extension -@end diff --git a/Example/Pods/Target Support Files/Pods-StepperView_Watch Extension/Pods-StepperView_Watch Extension-frameworks.sh b/Example/Pods/Target Support Files/Pods-StepperView_Watch Extension/Pods-StepperView_Watch Extension-frameworks.sh deleted file mode 100755 index 0b7f88e..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Watch Extension/Pods-StepperView_Watch Extension-frameworks.sh +++ /dev/null @@ -1,185 +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. - 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}/StepperView-watchOS/StepperView.framework" -fi -if [[ "$CONFIGURATION" == "Release" ]]; then - install_framework "${BUILT_PRODUCTS_DIR}/StepperView-watchOS/StepperView.framework" -fi -if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then - wait -fi diff --git a/Example/Pods/Target Support Files/Pods-StepperView_Watch Extension/Pods-StepperView_Watch Extension-umbrella.h b/Example/Pods/Target Support Files/Pods-StepperView_Watch Extension/Pods-StepperView_Watch Extension-umbrella.h deleted file mode 100644 index c367879..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Watch Extension/Pods-StepperView_Watch Extension-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_StepperView_Watch_ExtensionVersionNumber; -FOUNDATION_EXPORT const unsigned char Pods_StepperView_Watch_ExtensionVersionString[]; - diff --git a/Example/Pods/Target Support Files/Pods-StepperView_Watch Extension/Pods-StepperView_Watch Extension.debug.xcconfig b/Example/Pods/Target Support Files/Pods-StepperView_Watch Extension/Pods-StepperView_Watch Extension.debug.xcconfig deleted file mode 100644 index 670cb41..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Watch Extension/Pods-StepperView_Watch Extension.debug.xcconfig +++ /dev/null @@ -1,14 +0,0 @@ -ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/StepperView-watchOS" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/StepperView-watchOS/StepperView.framework/Headers" -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_LDFLAGS = $(inherited) -framework "StepperView" -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-StepperView_Watch Extension/Pods-StepperView_Watch Extension.modulemap b/Example/Pods/Target Support Files/Pods-StepperView_Watch Extension/Pods-StepperView_Watch Extension.modulemap deleted file mode 100644 index 9f6bbd3..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Watch Extension/Pods-StepperView_Watch Extension.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module Pods_StepperView_Watch_Extension { - umbrella header "Pods-StepperView_Watch Extension-umbrella.h" - - export * - module * { export * } -} diff --git a/Example/Pods/Target Support Files/Pods-StepperView_Watch Extension/Pods-StepperView_Watch Extension.release.xcconfig b/Example/Pods/Target Support Files/Pods-StepperView_Watch Extension/Pods-StepperView_Watch Extension.release.xcconfig deleted file mode 100644 index 670cb41..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Watch Extension/Pods-StepperView_Watch Extension.release.xcconfig +++ /dev/null @@ -1,14 +0,0 @@ -ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/StepperView-watchOS" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/StepperView-watchOS/StepperView.framework/Headers" -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_LDFLAGS = $(inherited) -framework "StepperView" -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-StepperView_Watch/Pods-StepperView_Watch-Info.plist b/Example/Pods/Target Support Files/Pods-StepperView_Watch/Pods-StepperView_Watch-Info.plist deleted file mode 100644 index 2243fe6..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Watch/Pods-StepperView_Watch-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-StepperView_Watch/Pods-StepperView_Watch-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-StepperView_Watch/Pods-StepperView_Watch-acknowledgements.markdown deleted file mode 100644 index c55c9ab..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Watch/Pods-StepperView_Watch-acknowledgements.markdown +++ /dev/null @@ -1,26 +0,0 @@ -# Acknowledgements -This application makes use of the following third party libraries: - -## StepperView - -Copyright (c) 2020 Badarinath Venkatnarayansetty - -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-StepperView_Watch/Pods-StepperView_Watch-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-StepperView_Watch/Pods-StepperView_Watch-acknowledgements.plist deleted file mode 100644 index db25d8f..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Watch/Pods-StepperView_Watch-acknowledgements.plist +++ /dev/null @@ -1,58 +0,0 @@ - - - - - PreferenceSpecifiers - - - FooterText - This application makes use of the following third party libraries: - Title - Acknowledgements - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2020 Badarinath Venkatnarayansetty <badrinathvm@gmail.com> - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. - - License - MIT - Title - StepperView - 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-StepperView_Watch/Pods-StepperView_Watch-dummy.m b/Example/Pods/Target Support Files/Pods-StepperView_Watch/Pods-StepperView_Watch-dummy.m deleted file mode 100644 index bf0de73..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Watch/Pods-StepperView_Watch-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Pods_StepperView_Watch : NSObject -@end -@implementation PodsDummy_Pods_StepperView_Watch -@end diff --git a/Example/Pods/Target Support Files/Pods-StepperView_Watch/Pods-StepperView_Watch-frameworks.sh b/Example/Pods/Target Support Files/Pods-StepperView_Watch/Pods-StepperView_Watch-frameworks.sh deleted file mode 100755 index 0b7f88e..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Watch/Pods-StepperView_Watch-frameworks.sh +++ /dev/null @@ -1,185 +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. - 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}/StepperView-watchOS/StepperView.framework" -fi -if [[ "$CONFIGURATION" == "Release" ]]; then - install_framework "${BUILT_PRODUCTS_DIR}/StepperView-watchOS/StepperView.framework" -fi -if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then - wait -fi diff --git a/Example/Pods/Target Support Files/Pods-StepperView_Watch/Pods-StepperView_Watch-umbrella.h b/Example/Pods/Target Support Files/Pods-StepperView_Watch/Pods-StepperView_Watch-umbrella.h deleted file mode 100644 index f318b88..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Watch/Pods-StepperView_Watch-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_StepperView_WatchVersionNumber; -FOUNDATION_EXPORT const unsigned char Pods_StepperView_WatchVersionString[]; - diff --git a/Example/Pods/Target Support Files/Pods-StepperView_Watch/Pods-StepperView_Watch.debug.xcconfig b/Example/Pods/Target Support Files/Pods-StepperView_Watch/Pods-StepperView_Watch.debug.xcconfig deleted file mode 100644 index 670cb41..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Watch/Pods-StepperView_Watch.debug.xcconfig +++ /dev/null @@ -1,14 +0,0 @@ -ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/StepperView-watchOS" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/StepperView-watchOS/StepperView.framework/Headers" -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_LDFLAGS = $(inherited) -framework "StepperView" -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-StepperView_Watch/Pods-StepperView_Watch.modulemap b/Example/Pods/Target Support Files/Pods-StepperView_Watch/Pods-StepperView_Watch.modulemap deleted file mode 100644 index e93e460..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Watch/Pods-StepperView_Watch.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module Pods_StepperView_Watch { - umbrella header "Pods-StepperView_Watch-umbrella.h" - - export * - module * { export * } -} diff --git a/Example/Pods/Target Support Files/Pods-StepperView_Watch/Pods-StepperView_Watch.release.xcconfig b/Example/Pods/Target Support Files/Pods-StepperView_Watch/Pods-StepperView_Watch.release.xcconfig deleted file mode 100644 index 670cb41..0000000 --- a/Example/Pods/Target Support Files/Pods-StepperView_Watch/Pods-StepperView_Watch.release.xcconfig +++ /dev/null @@ -1,14 +0,0 @@ -ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/StepperView-watchOS" -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/StepperView-watchOS/StepperView.framework/Headers" -LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' -OTHER_LDFLAGS = $(inherited) -framework "StepperView" -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/SnapshotTesting/SnapshotTesting-Info.plist b/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting-Info.plist deleted file mode 100644 index 8d3c89a..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.7.2 - 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-prefix.pch b/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting-prefix.pch deleted file mode 100644 index beb2a24..0000000 --- a/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting-umbrella.h b/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting-umbrella.h deleted file mode 100644 index cf2e3d0..0000000 --- a/Example/Pods/Target Support Files/SnapshotTesting/SnapshotTesting-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 SnapshotTestingVersionNumber; -FOUNDATION_EXPORT const unsigned char SnapshotTestingVersionString[]; - 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 b404952..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" -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 b404952..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" -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 a9baeb7..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 -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 -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/Pods/Target Support Files/StepperView-iOS/StepperView-iOS-Info.plist b/Example/Pods/Target Support Files/StepperView-iOS/StepperView-iOS-Info.plist deleted file mode 100644 index 7595523..0000000 --- a/Example/Pods/Target Support Files/StepperView-iOS/StepperView-iOS-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.5.6 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSPrincipalClass - - - diff --git a/Example/Pods/Target Support Files/StepperView-iOS/StepperView-iOS-dummy.m b/Example/Pods/Target Support Files/StepperView-iOS/StepperView-iOS-dummy.m deleted file mode 100644 index 2482645..0000000 --- a/Example/Pods/Target Support Files/StepperView-iOS/StepperView-iOS-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_StepperView_iOS : NSObject -@end -@implementation PodsDummy_StepperView_iOS -@end diff --git a/Example/Pods/Target Support Files/StepperView-iOS/StepperView-iOS-prefix.pch b/Example/Pods/Target Support Files/StepperView-iOS/StepperView-iOS-prefix.pch deleted file mode 100644 index beb2a24..0000000 --- a/Example/Pods/Target Support Files/StepperView-iOS/StepperView-iOS-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Example/Pods/Target Support Files/StepperView-iOS/StepperView-iOS-umbrella.h b/Example/Pods/Target Support Files/StepperView-iOS/StepperView-iOS-umbrella.h deleted file mode 100644 index 252f6fb..0000000 --- a/Example/Pods/Target Support Files/StepperView-iOS/StepperView-iOS-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 StepperViewVersionNumber; -FOUNDATION_EXPORT const unsigned char StepperViewVersionString[]; - diff --git a/Example/Pods/Target Support Files/StepperView-iOS/StepperView-iOS.debug.xcconfig b/Example/Pods/Target Support Files/StepperView-iOS/StepperView-iOS.debug.xcconfig deleted file mode 100644 index 01ca794..0000000 --- a/Example/Pods/Target Support Files/StepperView-iOS/StepperView-iOS.debug.xcconfig +++ /dev/null @@ -1,12 +0,0 @@ -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/StepperView-iOS -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -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}/../.. -PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/Pods/Target Support Files/StepperView-iOS/StepperView-iOS.modulemap b/Example/Pods/Target Support Files/StepperView-iOS/StepperView-iOS.modulemap deleted file mode 100644 index aee00e1..0000000 --- a/Example/Pods/Target Support Files/StepperView-iOS/StepperView-iOS.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module StepperView { - umbrella header "StepperView-iOS-umbrella.h" - - export * - module * { export * } -} diff --git a/Example/Pods/Target Support Files/StepperView-iOS/StepperView-iOS.release.xcconfig b/Example/Pods/Target Support Files/StepperView-iOS/StepperView-iOS.release.xcconfig deleted file mode 100644 index 01ca794..0000000 --- a/Example/Pods/Target Support Files/StepperView-iOS/StepperView-iOS.release.xcconfig +++ /dev/null @@ -1,12 +0,0 @@ -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/StepperView-iOS -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -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}/../.. -PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/Pods/Target Support Files/StepperView-watchOS/StepperView-watchOS-Info.plist b/Example/Pods/Target Support Files/StepperView-watchOS/StepperView-watchOS-Info.plist deleted file mode 100644 index 7595523..0000000 --- a/Example/Pods/Target Support Files/StepperView-watchOS/StepperView-watchOS-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.5.6 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSPrincipalClass - - - diff --git a/Example/Pods/Target Support Files/StepperView-watchOS/StepperView-watchOS-dummy.m b/Example/Pods/Target Support Files/StepperView-watchOS/StepperView-watchOS-dummy.m deleted file mode 100644 index 7b82fc3..0000000 --- a/Example/Pods/Target Support Files/StepperView-watchOS/StepperView-watchOS-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_StepperView_watchOS : NSObject -@end -@implementation PodsDummy_StepperView_watchOS -@end diff --git a/Example/Pods/Target Support Files/StepperView-watchOS/StepperView-watchOS-prefix.pch b/Example/Pods/Target Support Files/StepperView-watchOS/StepperView-watchOS-prefix.pch deleted file mode 100644 index e33fc32..0000000 --- a/Example/Pods/Target Support Files/StepperView-watchOS/StepperView-watchOS-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Example/Pods/Target Support Files/StepperView-watchOS/StepperView-watchOS-umbrella.h b/Example/Pods/Target Support Files/StepperView-watchOS/StepperView-watchOS-umbrella.h deleted file mode 100644 index 3027c22..0000000 --- a/Example/Pods/Target Support Files/StepperView-watchOS/StepperView-watchOS-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 StepperViewVersionNumber; -FOUNDATION_EXPORT const unsigned char StepperViewVersionString[]; - diff --git a/Example/Pods/Target Support Files/StepperView-watchOS/StepperView-watchOS.debug.xcconfig b/Example/Pods/Target Support Files/StepperView-watchOS/StepperView-watchOS.debug.xcconfig deleted file mode 100644 index f28f958..0000000 --- a/Example/Pods/Target Support Files/StepperView-watchOS/StepperView-watchOS.debug.xcconfig +++ /dev/null @@ -1,13 +0,0 @@ -APPLICATION_EXTENSION_API_ONLY = YES -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/StepperView-watchOS -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -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}/../.. -PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/Pods/Target Support Files/StepperView-watchOS/StepperView-watchOS.modulemap b/Example/Pods/Target Support Files/StepperView-watchOS/StepperView-watchOS.modulemap deleted file mode 100644 index 26b2034..0000000 --- a/Example/Pods/Target Support Files/StepperView-watchOS/StepperView-watchOS.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module StepperView { - umbrella header "StepperView-watchOS-umbrella.h" - - export * - module * { export * } -} diff --git a/Example/Pods/Target Support Files/StepperView-watchOS/StepperView-watchOS.release.xcconfig b/Example/Pods/Target Support Files/StepperView-watchOS/StepperView-watchOS.release.xcconfig deleted file mode 100644 index f28f958..0000000 --- a/Example/Pods/Target Support Files/StepperView-watchOS/StepperView-watchOS.release.xcconfig +++ /dev/null @@ -1,13 +0,0 @@ -APPLICATION_EXTENSION_API_ONLY = YES -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/StepperView-watchOS -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -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}/../.. -PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Example/StepperView.xcodeproj/project.pbxproj b/Example/StepperView.xcodeproj/project.pbxproj index a8c3467..92c6705 100644 --- a/Example/StepperView.xcodeproj/project.pbxproj +++ b/Example/StepperView.xcodeproj/project.pbxproj @@ -671,10 +671,12 @@ inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-StepperView_Example/Pods-StepperView_Example-frameworks.sh", "${BUILT_PRODUCTS_DIR}/StepperView-iOS/StepperView.framework", + "${BUILT_PRODUCTS_DIR}/Yams/Yams.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/StepperView.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Yams.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; @@ -834,7 +836,7 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 6.1; + WATCHOS_DEPLOYMENT_TARGET = 7.0; }; name = Debug; }; @@ -861,7 +863,7 @@ SKIP_INSTALL = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 6.1; + WATCHOS_DEPLOYMENT_TARGET = 7.0; }; name = Release; }; @@ -890,7 +892,7 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 6.1; + WATCHOS_DEPLOYMENT_TARGET = 7.0; }; name = Debug; }; @@ -916,7 +918,7 @@ SKIP_INSTALL = YES; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = 4; - WATCHOS_DEPLOYMENT_TARGET = 6.1; + WATCHOS_DEPLOYMENT_TARGET = 7.0; }; name = Release; }; @@ -968,7 +970,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -1017,7 +1019,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; @@ -1031,7 +1033,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; INFOPLIST_FILE = StepperView/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + 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)"; @@ -1047,7 +1049,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; INFOPLIST_FILE = StepperView/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + 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)"; diff --git a/Example/StepperView/ExampleView.swift b/Example/StepperView/ExampleView.swift index d358dd3..d11b3ce 100644 --- a/Example/StepperView/ExampleView.swift +++ b/Example/StepperView/ExampleView.swift @@ -9,7 +9,6 @@ import SwiftUI import StepperView -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct ExampleView: View { var body: some View { TabView { @@ -18,16 +17,20 @@ struct ExampleView: View { Image(systemName: "mappin.and.ellipse") Text("PitStops") } + #if canImport(FoundationModels) + if #available(iOS 26.0, *) { + StepperViewAIGeneratorView() + .tabItem { + Image(systemName: "wand.and.stars") + Text("AI") + } + } + #endif ExampleView5() .tabItem { Image(systemName: "list.bullet") Text("Examples") } - ExampleView11() - .tabItem { - Image(systemName: "arrow.triangle.2.circlepath") - Text("LifeCycle") - } // ExampleView2() // .tabItem { Text("Usecase") .foregroundColor(Color.black) } ExampleView3() @@ -40,6 +43,11 @@ struct ExampleView: View { Image(systemName: "circle.grid.2x2") Text("Basic") } + ExampleView11() + .tabItem { + Image(systemName: "arrow.triangle.2.circlepath") + Text("LifeCycle") + } } // to test dynamic way of adding steps, use ExampleView9 diff --git a/Example/StepperView/ExampleView1.swift b/Example/StepperView/ExampleView1.swift index 2e13dca..647490c 100644 --- a/Example/StepperView/ExampleView1.swift +++ b/Example/StepperView/ExampleView1.swift @@ -9,7 +9,6 @@ import SwiftUI import StepperView -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct ExampleView1: View { //alignments for the cell here to point diff --git a/Example/StepperView/ExampleView10.swift b/Example/StepperView/ExampleView10.swift index 192d5e7..2889469 100644 --- a/Example/StepperView/ExampleView10.swift +++ b/Example/StepperView/ExampleView10.swift @@ -9,7 +9,6 @@ import SwiftUI import StepperView -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct ExampleView10: View { let cells = [ TestTextView(text:"Insert ATM Card"), @@ -36,7 +35,6 @@ struct ExampleView10: View { } } -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct TestTextView: View { var text:String var body: some View { diff --git a/Example/StepperView/ExampleView11.swift b/Example/StepperView/ExampleView11.swift index 249d115..6af0c7d 100644 --- a/Example/StepperView/ExampleView11.swift +++ b/Example/StepperView/ExampleView11.swift @@ -10,10 +10,8 @@ import SwiftUI import UIKit import StepperView -let customGreen = Color(red: 0.00, green: 0.80, blue: 0.66, alpha: 1.00) - -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct ExampleView11: View { + let customGreen = Color(red: 0.00, green: 0.80, blue: 0.66, opacity: 1.0) let cells = [ CustomStepTextView(text: "Basic Details"), CustomStepTextView(text: "Company Details"), CustomStepTextView(text: "Subscription plan"), @@ -96,7 +94,7 @@ struct ExampleView11: View { StepperIndicationType.custom(IndicatorImageView(name: "completed")), StepperIndicationType.custom(IndicatorImageView(name:"pending")) ]) - .lineOptions(StepperLineOptions.rounded(4, 8, Color(customGreen))) + .lineOptions(StepperLineOptions.rounded(4, 8, customGreen)) .stepLifeCycles([StepLifeCycle.completed, .completed, .completed, .pending]) .spacing(40) .padding(.leading, 50) @@ -104,7 +102,7 @@ struct ExampleView11: View { StepperView() .addSteps(cells) .indicators(indicators) - .lineOptions(StepperLineOptions.rounded(4, 8, Color(customGreen))) + .lineOptions(StepperLineOptions.rounded(4, 8, customGreen)) .stepLifeCycles([StepLifeCycle.completed, .completed, .pending, .pending]) .spacing(40) .padding(.leading, 50) @@ -118,7 +116,7 @@ struct ExampleView11: View { StepperIndicationType.custom(IndicatorImageView(name: "completed")), StepperIndicationType.custom(IndicatorImageView(name: "completed")) ]) - .lineOptions(StepperLineOptions.custom(4, Color(customGreen))) + .lineOptions(StepperLineOptions.custom(4, customGreen)) .stepLifeCycles([StepLifeCycle.completed, .completed ]) .spacing(50) .padding(.leading, 10) @@ -128,7 +126,6 @@ struct ExampleView11: View { } } -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct IndicatorImageView: View { var name:String var body: some View { @@ -144,7 +141,6 @@ struct IndicatorImageView: View { } } -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct CustomStepTextView: View { var text:String var body: some View { @@ -157,7 +153,6 @@ struct CustomStepTextView: View { } } -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct ExampleView11_Previews: PreviewProvider { static var previews: some View { ExampleView11() diff --git a/Example/StepperView/ExampleView12.swift b/Example/StepperView/ExampleView12.swift index 630e025..3677545 100644 --- a/Example/StepperView/ExampleView12.swift +++ b/Example/StepperView/ExampleView12.swift @@ -9,7 +9,6 @@ import SwiftUI import StepperView -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct ExampleView12: View { let steps = [ Text("Cart").font(.caption), Text("Delivery Address").font(.caption), diff --git a/Example/StepperView/ExampleView2.swift b/Example/StepperView/ExampleView2.swift index 5f1538b..dabe85c 100644 --- a/Example/StepperView/ExampleView2.swift +++ b/Example/StepperView/ExampleView2.swift @@ -8,7 +8,6 @@ import SwiftUI import StepperView -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct ExampleView2:View { let cells = [ StepTextView(text: "Insert ATM Card"), diff --git a/Example/StepperView/ExampleView3.swift b/Example/StepperView/ExampleView3.swift index 1d57b5a..05985bb 100644 --- a/Example/StepperView/ExampleView3.swift +++ b/Example/StepperView/ExampleView3.swift @@ -9,7 +9,6 @@ import SwiftUI import StepperView -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct ExampleView3:View { let cells = [ ImageTextRowView(text: "Insert ATM Card", imageName: "cc"), diff --git a/Example/StepperView/ExampleView4.swift b/Example/StepperView/ExampleView4.swift index b194f04..04597b8 100644 --- a/Example/StepperView/ExampleView4.swift +++ b/Example/StepperView/ExampleView4.swift @@ -9,7 +9,6 @@ import SwiftUI import StepperView -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct ExampleView4: View { //alignments for the cell here to point diff --git a/Example/StepperView/ExampleView5.swift b/Example/StepperView/ExampleView5.swift index a3e0715..373601f 100644 --- a/Example/StepperView/ExampleView5.swift +++ b/Example/StepperView/ExampleView5.swift @@ -9,7 +9,6 @@ import SwiftUI import StepperView -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct ExampleView5: View { let indicationTypes = [ diff --git a/Example/StepperView/ExampleView6.swift b/Example/StepperView/ExampleView6.swift index 444550e..ab0832b 100644 --- a/Example/StepperView/ExampleView6.swift +++ b/Example/StepperView/ExampleView6.swift @@ -11,14 +11,13 @@ import SwiftUI import StepperView import WebKit -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct ExampleView6: View { let indicators = [ StepperIndicationType.custom(NumberedCircleView(text: "1", width: 40).eraseToAnyView()), StepperIndicationType.custom(CircledIconView(image: Image("like"), width: 40, - strokeColor: Color(red: 26/255, green: 188/255, blue: 156/255, alpha: 1.0)) + strokeColor: Color(red: 26/255, green: 188/255, blue: 156/255, opacity: 1.0)) .eraseToAnyView()), StepperIndicationType.custom(CircledIconView(image: Image("flag"), width: 40, @@ -43,7 +42,7 @@ struct ExampleView6: View { let pitStopLines = [ StepperLineOptions.custom(1, Colors.teal.rawValue), - StepperLineOptions.custom(1, Color(red: 26/255, green: 188/255, blue: 156/255, alpha: 1.0)), + StepperLineOptions.custom(1, Color(red: 26/255, green: 188/255, blue: 156/255, opacity: 1.0)), StepperLineOptions.custom(1, Color.red), StepperLineOptions.custom(1, Colors.gray(.darkSilver).rawValue) ] diff --git a/Example/StepperView/ExampleView7.swift b/Example/StepperView/ExampleView7.swift index 5c5dc8a..1eb8d7b 100644 --- a/Example/StepperView/ExampleView7.swift +++ b/Example/StepperView/ExampleView7.swift @@ -9,7 +9,6 @@ import SwiftUI import StepperView -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct ExampleView7: View { let indicationTypes = [ diff --git a/Example/StepperView/ExampleView8.swift b/Example/StepperView/ExampleView8.swift index 33c4d48..f3e63c0 100644 --- a/Example/StepperView/ExampleView8.swift +++ b/Example/StepperView/ExampleView8.swift @@ -10,7 +10,6 @@ import Foundation import SwiftUI import StepperView -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct ExampleView8: View { let indicators = [ diff --git a/Example/StepperView/ExampleView9.swift b/Example/StepperView/ExampleView9.swift index 87cd769..c741ae0 100644 --- a/Example/StepperView/ExampleView9.swift +++ b/Example/StepperView/ExampleView9.swift @@ -9,7 +9,6 @@ import SwiftUI import StepperView -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct ExampleView9: View { // steps for vertical mode ( for adding dynamic steps , make it `@State` property) diff --git a/Example/StepperView/FurtherReadingView.swift b/Example/StepperView/FurtherReadingView.swift index 9a7da8d..ecb252b 100644 --- a/Example/StepperView/FurtherReadingView.swift +++ b/Example/StepperView/FurtherReadingView.swift @@ -8,7 +8,6 @@ import SwiftUI -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct FurtherReadingView:View { var body: some View { VStack(alignment: .leading, spacing: 2) { diff --git a/Example/StepperView/ImageTextRowView.swift b/Example/StepperView/ImageTextRowView.swift index 50a264e..7302a78 100644 --- a/Example/StepperView/ImageTextRowView.swift +++ b/Example/StepperView/ImageTextRowView.swift @@ -9,7 +9,6 @@ import SwiftUI import StepperView -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct ImageTextRowView: View { var text:String var imageName:String diff --git a/Example/StepperView/StepTextView.swift b/Example/StepperView/StepTextView.swift index d5898bb..2baa685 100644 --- a/Example/StepperView/StepTextView.swift +++ b/Example/StepperView/StepTextView.swift @@ -10,7 +10,6 @@ import Foundation import SwiftUI import StepperView -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct StepTextView: View { var text:String var body: some View { diff --git a/Example/StepperView/StepperContentView.swift b/Example/StepperView/StepperContentView.swift index 1b7be64..02dec56 100644 --- a/Example/StepperView/StepperContentView.swift +++ b/Example/StepperView/StepperContentView.swift @@ -10,7 +10,6 @@ import SwiftUI import StepperView // MARK: - Stepper Content View -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct StepperContentView: View { var body: some View { return rectangleContent() @@ -49,7 +48,6 @@ struct StepperContentView: View { } // MARK: - Image View to host Image -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct ImageView: View { var name:String var body: some View { diff --git a/Example/StepperView/ViewController.swift b/Example/StepperView/ViewController.swift index 6f2f87e..87dfd90 100644 --- a/Example/StepperView/ViewController.swift +++ b/Example/StepperView/ViewController.swift @@ -14,7 +14,7 @@ class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - if #available(iOS 13.0, *) { + if #available(iOS 17.0, *) { let stepperView = UIHostingController(rootView: ExampleView()) stepperView.view.translatesAutoresizingMaskIntoConstraints = false self.view.addSubview(stepperView.view) diff --git a/Example/StepperView_Watch Extension/Views/WatchExampleView1.swift b/Example/StepperView_Watch Extension/Views/WatchExampleView1.swift index c311b3e..55b3a01 100644 --- a/Example/StepperView_Watch Extension/Views/WatchExampleView1.swift +++ b/Example/StepperView_Watch Extension/Views/WatchExampleView1.swift @@ -9,7 +9,6 @@ import SwiftUI import StepperView -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct WatchExampleView1: View { //step indications types diff --git a/Example/StepperView_Watch Extension/Views/WatchExampleView2.swift b/Example/StepperView_Watch Extension/Views/WatchExampleView2.swift index acd2077..b79658e 100644 --- a/Example/StepperView_Watch Extension/Views/WatchExampleView2.swift +++ b/Example/StepperView_Watch Extension/Views/WatchExampleView2.swift @@ -9,7 +9,6 @@ import SwiftUI import StepperView -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct WatchExampleView2: View { let indicationTypes = [ diff --git a/Example/StepperView_Watch Extension/Views/WatchExampleView3.swift b/Example/StepperView_Watch Extension/Views/WatchExampleView3.swift index 7d75e7e..dabea1e 100644 --- a/Example/StepperView_Watch Extension/Views/WatchExampleView3.swift +++ b/Example/StepperView_Watch Extension/Views/WatchExampleView3.swift @@ -9,16 +9,16 @@ import SwiftUI import StepperView -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct WatchExampleView3: View { let indicators = [ StepperIndicationType.custom(CircledIconView(image: Image("like"), width: 30, - strokeColor: Color(red: 26/255, green: 188/255, blue: 156/255, alpha: 1.0)) + strokeColor: Color(red: 26/255, green: 188/255, blue: 156/255, opacity: 1.0)) .eraseToAnyView()), StepperIndicationType.custom(CircledIconView(image: Image("flag"), width: 30, + strokeColor: Color.red) .eraseToAnyView()), StepperIndicationType.custom(CircledIconView(image: Image("cc"), diff --git a/Example/StepperView_Watch Extension/Views/WatchExampleView4.swift b/Example/StepperView_Watch Extension/Views/WatchExampleView4.swift index 570b4cf..9b601e6 100644 --- a/Example/StepperView_Watch Extension/Views/WatchExampleView4.swift +++ b/Example/StepperView_Watch Extension/Views/WatchExampleView4.swift @@ -9,13 +9,12 @@ import SwiftUI import StepperView -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct WatchExampleView4: View { let indicators = [ StepperIndicationType.custom(CircledIconView(image: Image("like"), width: 25, - strokeColor: Color(red: 26/255, green: 188/255, blue: 156/255, alpha: 1.0)) + strokeColor: Color(red: 26/255, green: 188/255, blue: 156/255, opacity: 1.0)) .eraseToAnyView()), StepperIndicationType.custom(CircledIconView(image: Image("star"), width: 25, @@ -37,7 +36,7 @@ struct WatchExampleView4: View { ] let pitStopLineOptions = [ - StepperLineOptions.custom(1, Color(red: 26/255, green: 188/255, blue: 156/255, alpha: 1.0)), + StepperLineOptions.custom(1, Color(red: 26/255, green: 188/255, blue: 156/255, opacity: 1.0)), StepperLineOptions.custom(1, Colors.red(.normal).rawValue), StepperLineOptions.custom(1, Colors.gray(.light).rawValue)] diff --git a/Example/StepperView_Watch Extension/Views/WatchExampleView5.swift b/Example/StepperView_Watch Extension/Views/WatchExampleView5.swift index 9706c4f..fa0a77b 100644 --- a/Example/StepperView_Watch Extension/Views/WatchExampleView5.swift +++ b/Example/StepperView_Watch Extension/Views/WatchExampleView5.swift @@ -10,7 +10,6 @@ import Foundation import SwiftUI import StepperView -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct WatchExampleView5: View { let indicationTypes = [ diff --git a/Example/Tests/StepperViewTests.swift b/Example/Tests/StepperViewTests.swift index c3da12c..99335ea 100644 --- a/Example/Tests/StepperViewTests.swift +++ b/Example/Tests/StepperViewTests.swift @@ -3,7 +3,6 @@ import StepperView import SnapshotTesting import SwiftUI -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) class StepperViewTests: XCTestCase { override func setUp() { @@ -138,7 +137,7 @@ class StepperViewTests: XCTestCase { let indicators = [ StepperIndicationType.custom(NumberedCircleView(text: "1", width: 40).eraseToAnyView()), .custom(CircledIconView(image: Image("like"), width: 40, - strokeColor: Color(red: 26/255, green: 188/255, blue: 156/255, alpha: 1.0)) + strokeColor: Color(red: 26/255, green: 188/255, blue: 156/255, opacity: 1.0)) .eraseToAnyView()), .custom(CircledIconView(image: Image("flag"), width: 40, strokeColor: Color.red).eraseToAnyView()), @@ -147,7 +146,7 @@ class StepperViewTests: XCTestCase { let pitStopLineOptions = [ StepperLineOptions.custom(1, Colors.teal.rawValue), - StepperLineOptions.custom(1, Color(red: 26/255, green: 188/255, blue: 156/255, alpha: 1.0)), + StepperLineOptions.custom(1, Color(red: 26/255, green: 188/255, blue: 156/255, opacity: 1.0)), StepperLineOptions.custom(1, Color.red), StepperLineOptions.custom(1, Colors.gray(.darkSilver).rawValue) ] diff --git a/Package.swift b/Package.swift index b9beed0..40d65e6 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version:5.1 +// swift-tools-version:5.9 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescription @@ -6,7 +6,7 @@ import PackageDescription let package = Package( name: "StepperView", platforms: [ - .iOS(.v11), .macOS(.v10_15) + .iOS(.v13), .macOS(.v10_15), .watchOS(.v7) ], products: [ // Products define the executables and libraries produced by a package, and make them visible to other packages. @@ -14,11 +14,16 @@ let package = Package( name: "StepperView", targets: ["StepperView"]), ], - dependencies: [], + dependencies: [ + .package(url: "https://github.com/jpsim/Yams.git", from: "5.0.0") + ], targets: [ .target( name: "StepperView", - dependencies: []), + dependencies: ["Yams"], + resources: [ + .process("Resources") + ]), .testTarget( name: "StepperViewTests", dependencies: ["StepperView"]) diff --git a/README.md b/README.md index b94b7d8..c6ad28f 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,7 @@ # Table of Contents * [Features](#features) +* [AI-Powered StepperView Generator](#ai-powered-stepperview-generator) * [Documentation](#documentation) * [Installation](#installation) * [CocoaPods](#cocoapods) @@ -51,6 +52,50 @@ - Customizable line,spacing & animation options. - Pitstop feature to add intermediate stages between Step Indicators - Support for updating the life cycle status for each of the steps +- **NEW:** AI-Powered StepperView Generator using Apple's on-device Foundation Models (iOS 26+) + +## AI-Powered StepperView Generator + +Generate fully configured StepperViews from natural language prompts using Apple's on-device Foundation Models framework. Describe what you want in plain English, and the AI generates a complete StepperView with indicators, colors, pit stops, and lifecycle states — all rendered live with copyable Swift code. + + +

+AI StepperView Generator +

+ +### Highlights + +- Describe your stepper in natural language (e.g., *"Create a delivery tracking stepper with 5 stops"*) +- Supports **vertical** and **horizontal** modes +- Choose from **numbered circles**, **plain circles**, or **SF Symbol** indicators +- Use **named colors** or any **hex color** (e.g., `#FF6B35`) +- Optionally add **pit stops** with descriptions +- **Live preview** and **copyable Swift code** in a tabbed interface +- Fully on-device — no network calls, powered by Apple Foundation Models + +### Quick Start + +```swift +import StepperView + +// Add to your SwiftUI view (iOS 26+ only) +if #available(iOS 26.0, *) { + StepperViewAIGeneratorView() +} +``` + +### Example Prompts + +| Prompt | What it generates | +|--------|-------------------| +| *"Create a 5-step checkout flow"* | Vertical stepper with numbered circles | +| *"Build a horizontal flight booking stepper with sfSymbol indicators"* | Horizontal stepper with SF Symbol icons | +| *"Make a recipe stepper in #E11D48 with details"* | Vertical stepper with hex color and pit stops | +| *"Create a 4-step onboarding flow in purple"* | Vertical stepper with AI-chosen purple hex color | + +### Configuration + +All AI generation behavior is configurable via `ai_config.yaml` — UI strings, default values, valid colors, SF Symbols allowlist, pit stop keywords, and the system prompt template can all be customized without touching Swift code. ## Documentation **[StepperView Reference](https://badrinathvm.github.io/StepperView/)** diff --git a/Resources/ai_config.yaml b/Resources/ai_config.yaml new file mode 100644 index 0000000..205e6c8 --- /dev/null +++ b/Resources/ai_config.yaml @@ -0,0 +1,121 @@ +# AI Stepper Configuration +# Edit this file to customize the AI generation behavior and UI. + +# UI Strings +ui: + navigationTitle: "AI Stepper" + headerText: "Describe your stepper" + placeholder: "e.g., Create a delivery tracking stepper with 5 stops" + generateButton: "Generate StepperView" + generatingButton: "Generating..." + previewTab: "Preview" + codeTab: "Code" + copyButton: "Copy" + errorPrefix: "Generation failed: " + +# Default values for stepper generation +defaults: + defaultStepCount: 5 + defaultMode: "vertical" + defaultSpacing: 50 + indicatorWidthMin: 30 + indicatorWidthMax: 40 + indicatorSize: 40 + pitStopHeightPerStep: 140 + defaultHeightPerStep: 80 + horizontalHeight: 150 + +# Valid color names the AI model can use +validColors: + - teal + - red + - green + - blue + - orange + - lavender + - cyan + +# Valid indicator types +validIndicatorTypes: + - numberedCircle + - circle + - sfSymbol + +# Curated list of valid SF Symbols +# Only these symbols are allowed — the model cannot invent names outside this list. +validSFSymbols: + - checkmark.circle.fill + - xmark.circle.fill + - star.fill + - heart.fill + - bell.fill + - flag.fill + - bookmark.fill + - tag.fill + - bolt.fill + - cart.fill + - house.fill + - gear + - person.fill + - envelope.fill + - phone.fill + - mappin.circle.fill + - location.fill + - clock.fill + - calendar + - alarm.fill + - shippingbox.fill + - cube.fill + - gift.fill + - creditcard.fill + - banknote.fill + - doc.text.fill + - folder.fill + - tray.fill + - archivebox.fill + - paperplane.fill + - leaf.fill + - drop.fill + - flame.fill + - snowflake + - sun.max.fill + - moon.fill + - cloud.fill + - wrench.fill + - hammer.fill + - paintbrush.fill + - scissors + - lock.fill + - key.fill + - wifi + - antenna.radiowaves.left.and.right + - airplane + - car.fill + - bus.fill + - bicycle + - figure.walk + +# Keywords in user prompt that trigger pit stop generation +pitStopKeywords: + - "pit stop" + - "pit stops" + - "pitstop" + - "pitstops" + - "description" + - "details" + - "subtitles" + +# System prompt template +# Uses {placeholders} that get replaced with values from this config. +systemPrompt: | + You are a StepperView configuration generator. Given a user's description, produce a structured stepper configuration. Follow these rules: + - Generate exactly {defaultStepCount} steps unless the user specifies a different number. + - Default to {defaultMode} mode with spacing {defaultSpacing}. + - Use valid color names: {validColors}. + - Use indicatorType values: {validIndicatorTypes}. + - When using sfSymbol, you MUST only use SF Symbol names from this list: {validSFSymbols}. Do NOT invent or guess symbol names outside this list. + - Set indicatorWidth between {indicatorWidthMin} and {indicatorWidthMax}. + - Mark earlier steps as completed and later steps as pending to show progress. + - IMPORTANT: Only include pitStopText when the user explicitly mentions "pit stop", "pit stops", "description", "details", or "subtitles" in their prompt. By default, do NOT include pitStopText. When pitStopText is omitted, set it to null for all steps. When pitStopText IS included, you MUST provide it for ALL steps with non-empty strings. + - Keep step titles concise (2-4 words). + - Set autoSpacing to true when pitStopText is provided, false otherwise. diff --git a/Sources/StepperView/Extension/Colors+Extension.swift b/Sources/StepperView/Extension/Colors+Extension.swift index b1264ce..721569a 100644 --- a/Sources/StepperView/Extension/Colors+Extension.swift +++ b/Sources/StepperView/Extension/Colors+Extension.swift @@ -9,7 +9,6 @@ import Foundation import SwiftUI /// Color palette helper accessing colors and it's variations. -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public enum Colors { /// red and it's associated variations case red(RedSubType) @@ -144,7 +143,6 @@ public enum Colors { } /// Vvsualize Color palette for each color and it's sub type variation -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) extension Colors { /// alias to `Color` public typealias RawValue = Color @@ -220,3 +218,22 @@ extension Colors { } } } + +// MARK: - Hex Color Support + +public extension Color { + /// Creates a Color from a hex string (e.g. "#FF6B35" or "FF6B35"). + /// Returns nil if the string is not a valid 6-character hex color. + init?(hex: String) { + let trimmed = hex.trimmingCharacters(in: .whitespacesAndNewlines) + let hexString = trimmed.hasPrefix("#") ? String(trimmed.dropFirst()) : trimmed + guard hexString.count == 6, + let hexNumber = UInt64(hexString, radix: 16) else { + return nil + } + let r = Double((hexNumber & 0xFF0000) >> 16) / 255.0 + let g = Double((hexNumber & 0x00FF00) >> 8) / 255.0 + let b = Double(hexNumber & 0x0000FF) / 255.0 + self.init(red: r, green: g, blue: b) + } +} diff --git a/Sources/StepperView/Extension/EnvironmentValues+Extension.swift b/Sources/StepperView/Extension/EnvironmentValues+Extension.swift index e371883..de4a428 100644 --- a/Sources/StepperView/Extension/EnvironmentValues+Extension.swift +++ b/Sources/StepperView/Extension/EnvironmentValues+Extension.swift @@ -9,7 +9,6 @@ import Foundation import SwiftUI /// Environment values configuration for standard size margins, can be used across the app -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) extension EnvironmentValues { /// property wrapper for `StepsKey` var steps: [AnyView] { @@ -91,91 +90,78 @@ extension EnvironmentValues { } /// Environment Key for Steps -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct StepsKey: EnvironmentKey { /// provide a default value for custom dependency static var defaultValue = [AnyView]() } /// Environment Key for alignments -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct AlignmentKey: EnvironmentKey { /// provide a default value for custom dependency static var defaultValue = [StepperAlignment]() } /// Environment Key for Indicators -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct IndicatorKey: EnvironmentKey { /// provide a default value for custom dependency static var defaultValue = [StepperIndicationType]() } /// Environment Key for StepIndicatorMode -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct StepIndicatorModeKey: EnvironmentKey { /// provide a default value for custom dependency static var defaultValue = StepperMode.vertical } /// Environment Key for Spacing -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct SpacingKey: EnvironmentKey { /// provide a default value for custom dependency static var defaultValue:CGFloat = 30.0 } /// Environment Key for Auto Spacing -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct AutoSpacingKey: EnvironmentKey { /// provide a default value for custom dependency static var defaultValue:Bool = false } /// Environment Key for Line Options -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct LineOptionsKey: EnvironmentKey { /// provide a default value for custom dependency static var defaultValue:StepperLineOptions = StepperLineOptions.defaults } /// Environment Key for pit stop line options. -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct PitStopOptionsKey: EnvironmentKey { /// provide a default value for custom dependency static var defaultValue = [AnyView]() } /// Environment Key for Line Options -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct PitStopLineOptionsKey: EnvironmentKey { /// provide a default value for custom dependency static var defaultValue:[StepperLineOptions] = [] } /// Environment Key for pit stop line options. -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct StepAnimationOptionsKey: EnvironmentKey { /// provide a default value for custom dependency static var defaultValue:Int = 0 } /// Environment Key for pit stop line options. -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct LoadAnimationOptionsKey: EnvironmentKey { /// provide a default value for custom dependency static var defaultValue:Double = 0.05 } /// Environment Key for pit stop line options. -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct StepLifeCycleKey: EnvironmentKey { /// provide a default value for custom dependency static var defaultValue:[StepLifeCycle] = [] } /// Environment Key for pit stop line options. -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct StepperEdgeInsetsKey: EnvironmentKey { /// provide a default value for custom dependency static var defaultValue: EdgeInsets = EdgeInsets(top: 10, leading: 10, bottom: 10, trailing: 10) diff --git a/Sources/StepperView/Extension/PreferenceKey+Extension.swift b/Sources/StepperView/Extension/PreferenceKey+Extension.swift index e2aa6b9..73dc408 100644 --- a/Sources/StepperView/Extension/PreferenceKey+Extension.swift +++ b/Sources/StepperView/Extension/PreferenceKey+Extension.swift @@ -9,7 +9,6 @@ import Foundation import SwiftUI /// Collects height of all the cells, with reduce takes the maximum value for the given key -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct HeightPreference: PreferenceKey { typealias Value = [Int:CGFloat] /// provide a default value for custom dependency @@ -21,7 +20,6 @@ struct HeightPreference: PreferenceKey { } /// Collects height of all the cells, with reduce takes the maximum value for the given key -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct VerticalHeightPreference: PreferenceKey { typealias Value = [Int:CGFloat] /// provide a default value for custom dependency @@ -33,7 +31,6 @@ struct VerticalHeightPreference: PreferenceKey { } /// Collects height of all pistop cells, with reduce takes the maximum value for the given key -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct PitstopHeightPreference: PreferenceKey { typealias Value = [Int:CGFloat] /// provide a default value for custom dependency @@ -45,7 +42,6 @@ struct PitstopHeightPreference: PreferenceKey { } /// Collects width of all the cells, with reduce takes the maximum value for the given key -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct WidthPreference: PreferenceKey { typealias Value = [Int:CGFloat] /// provide a default value for custom dependency @@ -56,7 +52,6 @@ struct WidthPreference: PreferenceKey { } /// Collects bound, center coordinates and pass layout data to it's parent View -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public struct BoundsPreferenceKey: PreferenceKey { public typealias Value = Anchor? diff --git a/Sources/StepperView/Extension/VerticalAlignment+Extension.swift b/Sources/StepperView/Extension/VerticalAlignment+Extension.swift index f27b827..8113b59 100644 --- a/Sources/StepperView/Extension/VerticalAlignment+Extension.swift +++ b/Sources/StepperView/Extension/VerticalAlignment+Extension.swift @@ -8,7 +8,6 @@ import SwiftUI /// custom alignments for positioning -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) extension VerticalAlignment { /// custom top alignment private enum CustomTopAlignment: AlignmentID { diff --git a/Sources/StepperView/Extension/View+Extensions.swift b/Sources/StepperView/Extension/View+Extensions.swift index 2e826a7..d02892e 100644 --- a/Sources/StepperView/Extension/View+Extensions.swift +++ b/Sources/StepperView/Extension/View+Extensions.swift @@ -10,7 +10,6 @@ import Combine // MARK: - Helper function of View to operate on. /// Helper function of `View` to operate on -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public extension View { /// Stores the height for each of column which will be passed as part of onPreference change parent view. diff --git a/Sources/StepperView/Resources/ai_config.yaml b/Sources/StepperView/Resources/ai_config.yaml new file mode 100644 index 0000000..f6a777a --- /dev/null +++ b/Sources/StepperView/Resources/ai_config.yaml @@ -0,0 +1,124 @@ +# AI Stepper Configuration +# Edit this file to customize the AI generation behavior and UI. + +# UI Strings +ui: + navigationTitle: "StepperView AI" + headerText: "Describe your stepper" + placeholder: "e.g., Create a delivery tracking stepper with 5 stops" + generateButton: "Generate StepperView" + generatingButton: "Generating..." + previewTab: "Preview" + codeTab: "Code" + copyButton: "Copy" + errorPrefix: "Generation failed: " + +# Default values for stepper generation +defaults: + defaultStepCount: 5 + defaultMode: "vertical" + defaultSpacing: 50 + indicatorWidthMin: 30 + indicatorWidthMax: 40 + indicatorSize: 40 + pitStopHeightPerStep: 140 + defaultHeightPerStep: 80 + horizontalHeight: 160 + +# Named colors the AI model can use (hex colors like "#FF6B35" are also supported) +validColors: + - teal + - red + - green + - blue + - orange + - lavender + - cyan + - black + - yellow + - polar + +# Valid indicator types +validIndicatorTypes: + - numberedCircle + - circle + - sfSymbol + +# Curated list of valid SF Symbols +# Only these symbols are allowed — the model cannot invent names outside this list. +validSFSymbols: + - checkmark.circle.fill + - xmark.circle.fill + - star.fill + - heart.fill + - bell.fill + - flag.fill + - bookmark.fill + - tag.fill + - bolt.fill + - cart.fill + - house.fill + - gear + - person.fill + - envelope.fill + - phone.fill + - mappin.circle.fill + - location.fill + - clock.fill + - calendar + - alarm.fill + - shippingbox.fill + - cube.fill + - gift.fill + - creditcard.fill + - banknote.fill + - doc.text.fill + - folder.fill + - tray.fill + - archivebox.fill + - paperplane.fill + - leaf.fill + - drop.fill + - flame.fill + - snowflake + - sun.max.fill + - moon.fill + - cloud.fill + - wrench.fill + - hammer.fill + - paintbrush.fill + - scissors + - lock.fill + - key.fill + - wifi + - antenna.radiowaves.left.and.right + - airplane + - car.fill + - bus.fill + - bicycle + - figure.walk + +# Keywords in user prompt that trigger pit stop generation +pitStopKeywords: + - "pit stop" + - "pit stops" + - "pitstop" + - "pitstops" + - "description" + - "details" + - "subtitles" + +# System prompt template +# Uses {placeholders} that get replaced with values from this config. +systemPrompt: | + You are a StepperView configuration generator. Given a user's description, produce a structured stepper configuration. Follow these rules: + - Generate exactly {defaultStepCount} steps unless the user specifies a different number. + - Default to {defaultMode} mode with spacing {defaultSpacing}. + - For colors, you can use named colors ({validColors}) OR any hex color string (e.g. "#FF6B35", "#8B5CF6", "#EC4899"). Prefer hex colors when the user describes a specific color theme. Use the SAME color for ALL steps. + - Use indicatorType values: {validIndicatorTypes}. IMPORTANT: Use the SAME indicatorType for ALL steps. Do not mix different indicator types. + - When using sfSymbol, you MUST only use SF Symbol names from this list: {validSFSymbols}. Do NOT invent or guess symbol names outside this list. + - Set indicatorWidth between {indicatorWidthMin} and {indicatorWidthMax}. + - Mark earlier steps as completed and later steps as pending to show progress. + - IMPORTANT: Only include pitStopText when the user explicitly mentions "pit stop", "pit stops", "description", "details", or "subtitles" in their prompt. By default, do NOT include pitStopText. When pitStopText is omitted, set it to null for all steps. When pitStopText IS included, you MUST provide it for ALL steps with non-empty strings. + - Keep step titles concise (2-4 words). + - Set autoSpacing to true when pitStopText is provided, false otherwise. diff --git a/Sources/StepperView/Utils/LoadingTimer.swift b/Sources/StepperView/Utils/LoadingTimer.swift index 161caa3..29cb2cb 100644 --- a/Sources/StepperView/Utils/LoadingTimer.swift +++ b/Sources/StepperView/Utils/LoadingTimer.swift @@ -9,7 +9,6 @@ import Foundation import Combine /// creates a publisher for loading time -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) class LoadingTimer { /// create a publisher diff --git a/Sources/StepperView/Views/AI/StepperAIConfig.swift b/Sources/StepperView/Views/AI/StepperAIConfig.swift new file mode 100644 index 0000000..138bb55 --- /dev/null +++ b/Sources/StepperView/Views/AI/StepperAIConfig.swift @@ -0,0 +1,125 @@ +// +// AIConfig.swift +// StepperView +// +// Created on 2/16/26. +// + +#if canImport(Yams) + +import Foundation +import Yams + +// MARK: - YAML Codable Models + +struct StepperAIConfigYAML: Codable { + let ui: UIStringsYAML + let defaults: DefaultsYAML + let validColors: [String] + let validIndicatorTypes: [String] + let validSFSymbols: [String] + let pitStopKeywords: [String] + let systemPrompt: String +} + +struct UIStringsYAML: Codable { + let navigationTitle: String + let headerText: String + let placeholder: String + let generateButton: String + let generatingButton: String + let previewTab: String + let codeTab: String + let copyButton: String + let errorPrefix: String +} + +struct DefaultsYAML: Codable { + let defaultStepCount: Int + let defaultMode: String + let defaultSpacing: Int + let indicatorWidthMin: Int + let indicatorWidthMax: Int + let indicatorSize: CGFloat + let pitStopHeightPerStep: CGFloat + let defaultHeightPerStep: CGFloat + let horizontalHeight: CGFloat +} + +// MARK: - StepperAIConfig (Public Interface) + +struct StepperAIConfig { + + private static let yaml: StepperAIConfigYAML = { + guard let url = resourceBundle.url(forResource: "ai_config", withExtension: "yaml"), + let data = try? Data(contentsOf: url), + let yamlString = String(data: data, encoding: .utf8), + let config = try? YAMLDecoder().decode(StepperAIConfigYAML.self, from: yamlString) + else { + fatalError("Failed to load ai_config.yaml from bundle resources.") + } + return config + }() + + /// Resolves the correct resource bundle for both SPM (`Bundle.module`) and CocoaPods (`resource_bundles`). + private static let resourceBundle: Bundle = { + #if SWIFT_PACKAGE + return Bundle.module + #else + // CocoaPods: resource_bundles creates a "StepperView.bundle" inside the framework bundle. + let frameworkBundle = Bundle(for: BundleToken.self) + guard let url = frameworkBundle.url(forResource: "StepperView", withExtension: "bundle"), + let bundle = Bundle(url: url) + else { + return frameworkBundle + } + return bundle + #endif + }() + + // MARK: - System Prompt + + static var systemPrompt: String { + yaml.systemPrompt + .replacingOccurrences(of: "{defaultStepCount}", with: "\(yaml.defaults.defaultStepCount)") + .replacingOccurrences(of: "{defaultMode}", with: yaml.defaults.defaultMode) + .replacingOccurrences(of: "{defaultSpacing}", with: "\(yaml.defaults.defaultSpacing)") + .replacingOccurrences(of: "{validColors}", with: yaml.validColors.joined(separator: ", ")) + .replacingOccurrences(of: "{validIndicatorTypes}", with: yaml.validIndicatorTypes.joined(separator: ", ")) + .replacingOccurrences(of: "{validSFSymbols}", with: yaml.validSFSymbols.joined(separator: ", ")) + .replacingOccurrences(of: "{indicatorWidthMin}", with: "\(yaml.defaults.indicatorWidthMin)") + .replacingOccurrences(of: "{indicatorWidthMax}", with: "\(yaml.defaults.indicatorWidthMax)") + } + + // MARK: - UI Strings + + struct UIStrings { + static var navigationTitle: String { yaml.ui.navigationTitle } + static var headerText: String { yaml.ui.headerText } + static var placeholder: String { yaml.ui.placeholder } + static var generateButton: String { yaml.ui.generateButton } + static var generatingButton: String { yaml.ui.generatingButton } + static var previewTab: String { yaml.ui.previewTab } + static var codeTab: String { yaml.ui.codeTab } + static var copyButton: String { yaml.ui.copyButton } + static var errorPrefix: String { yaml.ui.errorPrefix } + } + + // MARK: - Defaults + + static var defaults: DefaultsYAML { yaml.defaults } + + // MARK: - Valid Values + + static var validColors: [String] { yaml.validColors } + static var validIndicatorTypes: [String] { yaml.validIndicatorTypes } + static var validSFSymbols: [String] { yaml.validSFSymbols } + static var pitStopKeywords: [String] { yaml.pitStopKeywords } +} + +#if !SWIFT_PACKAGE +/// Anchor class for CocoaPods bundle lookup. +private class BundleToken {} +#endif + +#endif // canImport(Yams) diff --git a/Sources/StepperView/Views/AI/StepperAIModels.swift b/Sources/StepperView/Views/AI/StepperAIModels.swift new file mode 100644 index 0000000..3657161 --- /dev/null +++ b/Sources/StepperView/Views/AI/StepperAIModels.swift @@ -0,0 +1,59 @@ +// +// StepperAIModels.swift +// StepperView_Example +// +// Created on 2/15/26. +// + +import Foundation +#if canImport(FoundationModels) +import FoundationModels + +@available(iOS 26.0, *) +@Generable +public struct GeneratedStepperConfig: Codable { + @Guide(description: "A short descriptive title for the stepper, e.g. 'Delivery Tracking'") + public var title: String + + @Guide(description: "Layout mode: 'vertical' or 'horizontal'") + public var mode: String + + @Guide(description: "Spacing between steps, typically 30–80") + public var spacing: Double + + @Guide(description: "Whether to auto-calculate spacing based on content height") + public var autoSpacing: Bool + + @Guide(description: "The list of steps in the stepper") + public var steps: [GeneratedStep] +} + +@available(iOS 26.0, *) +@Generable +public struct GeneratedStep: Codable { + @Guide(description: "1-based sequential step number") + var stepNumber: Int + + @Guide(description: "Concise label for the step, 2-4 words") + var title: String + + @Guide(description: "Indicator style: 'numberedCircle', 'circle', or 'sfSymbol'") + var indicatorType: String + + @Guide(description: "SF Symbol name when indicatorType is 'sfSymbol', e.g. 'checkmark.circle.fill'") + var sfSymbolName: String? + + @Guide(description: "Color name from: 'teal', 'red', 'green', 'blue', 'orange', 'lavender', 'cyan'") + var color: String + + @Guide(description: "Width of the indicator circle, typically 30-40") + var indicatorWidth: Double + + @Guide(description: "Step lifecycle status: 'completed' or 'pending'") + var lifeCycle: String + + @Guide(description: "Optional descriptive text content for pit stop display") + var pitStopText: String? +} + +#endif diff --git a/Sources/StepperView/Views/AI/StepperViewAIGeneratorView.swift b/Sources/StepperView/Views/AI/StepperViewAIGeneratorView.swift new file mode 100644 index 0000000..f7e60e8 --- /dev/null +++ b/Sources/StepperView/Views/AI/StepperViewAIGeneratorView.swift @@ -0,0 +1,178 @@ +// +// AIGeneratorView.swift +// StepperView_Example +// +// Created on 2/15/26. +// + +import SwiftUI + +#if canImport(FoundationModels) +import FoundationModels + +@available(iOS 26.0, *) +public struct StepperViewAIGeneratorView: View { + @State private var promptText: String = "" + @State private var isLoading: Bool = false + @State private var generatedConfig: GeneratedStepperConfig? + @State private var errorMessage: String? + @State private var selectedTab: Int = 0 + + public init() {} + + public var body: some View { + NavigationView { + ScrollView(.vertical, showsIndicators: true) { + VStack(alignment: .leading, spacing: 16) { + Text(StepperAIConfig.UIStrings.headerText) + .font(.headline) + .padding(.top) + + TextField(StepperAIConfig.UIStrings.placeholder, + text: $promptText, + axis: .vertical) + .textFieldStyle(.roundedBorder) + .lineLimit(3...6) + + Button(action: generateStepper) { + HStack { + if isLoading { + ProgressView() + .progressViewStyle(CircularProgressViewStyle()) + .padding(.trailing, 4) + } + Text(isLoading ? StepperAIConfig.UIStrings.generatingButton : StepperAIConfig.UIStrings.generateButton) + } + .frame(maxWidth: .infinity) + .padding(.vertical, 12) + .background(promptText.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty || isLoading + ? Color.gray.opacity(0.3) + : Colors.teal.rawValue) + .foregroundColor(.white) + .cornerRadius(10) + } + .disabled(promptText.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty || isLoading) + + if let errorMessage = errorMessage { + Text(errorMessage) + .foregroundColor(.red) + .font(.caption) + } + + if let config = generatedConfig { + Divider() + + Text(config.title) + .font(.title2) + .fontWeight(.bold) + .padding(.top, 8) + + Picker("View", selection: $selectedTab) { + Text(StepperAIConfig.UIStrings.previewTab).tag(0) + Text(StepperAIConfig.UIStrings.codeTab).tag(1) + } + .pickerStyle(.segmented) + + if selectedTab == 0 { + let hasPitStops = config.steps.contains { $0.pitStopText != nil && !($0.pitStopText?.isEmpty ?? true) } + let stepCount = CGFloat(config.steps.count) + let estimatedHeight: CGFloat = hasPitStops + ? stepCount * StepperAIConfig.defaults.pitStopHeightPerStep + : stepCount * StepperAIConfig.defaults.defaultHeightPerStep + + if config.mode.lowercased() == "horizontal" { + ScrollView(.horizontal, showsIndicators: false) { + StepperAIBuilder.buildStepperView(from: config) + .padding(.all, 40) + .padding(.top, 5) + } + } else { + StepperAIBuilder.buildStepperView(from: config) + .frame(height: estimatedHeight) + } + } else { + let code = StepperAIBuilder.generateCode(from: config) + VStack(alignment: .leading, spacing: 8) { + HStack { + Spacer() + Button(action: { + UIPasteboard.general.string = code + }) { + Label(StepperAIConfig.UIStrings.copyButton, systemImage: "doc.on.doc") + .font(.caption) + } + } + + ScrollView(.horizontal, showsIndicators: true) { + Text(code) + .font(.system(.caption, design: .monospaced)) + .textSelection(.enabled) + .padding(12) + } + .background(Color(.systemGray6)) + .cornerRadius(8) + } + } + } + } + .padding(.horizontal) + } + .navigationTitle(StepperAIConfig.UIStrings.navigationTitle) + .navigationBarTitleDisplayMode(.inline) + } + .navigationViewStyle(.stack) + } + + private func generateStepper() { + let prompt = promptText.trimmingCharacters(in: .whitespacesAndNewlines) + guard !prompt.isEmpty else { return } + + isLoading = true + errorMessage = nil + generatedConfig = nil + + Task { + do { + let session = LanguageModelSession(instructions: StepperAIConfig.systemPrompt) + let response = try await session.respond(to: prompt, generating: GeneratedStepperConfig.self) + var config = response.content + + // Enforce uniform indicator type and color across all steps using the first step's values. + if let firstStep = config.steps.first { + let uniformType = firstStep.indicatorType + let uniformColor = firstStep.color + config.steps = config.steps.map { step in + var s = step + s.indicatorType = uniformType + s.color = uniformColor + return s + } + } + + // Strip pit stops unless the user explicitly requested them. + let lowered = prompt.lowercased() + let wantsPitStops = StepperAIConfig.pitStopKeywords.contains { lowered.contains($0) } + if !wantsPitStops { + config.steps = config.steps.map { step in + var s = step + s.pitStopText = nil + return s + } + config.autoSpacing = false + } + + await MainActor.run { + generatedConfig = config + isLoading = false + } + } catch { + await MainActor.run { + errorMessage = "\(StepperAIConfig.UIStrings.errorPrefix)\(error.localizedDescription)" + isLoading = false + } + } + } + } +} + +#endif diff --git a/Sources/StepperView/Views/Components/TextView.swift b/Sources/StepperView/Views/Components/TextView.swift index d8a947c..714e754 100644 --- a/Sources/StepperView/Views/Components/TextView.swift +++ b/Sources/StepperView/Views/Components/TextView.swift @@ -8,7 +8,6 @@ import SwiftUI /// A `View` for hostign text with proper `frame` `alignment` , `lineLimit` modifiers -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public struct TextView: View { /// placeholder for text public var text:String diff --git a/Sources/StepperView/Views/Indicators/CircledIconView.swift b/Sources/StepperView/Views/Indicators/CircledIconView.swift index dac2935..3de92ae 100644 --- a/Sources/StepperView/Views/Indicators/CircledIconView.swift +++ b/Sources/StepperView/Views/Indicators/CircledIconView.swift @@ -8,7 +8,6 @@ import SwiftUI /// A Circled Icon `View ` for Step Indicator -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public struct CircledIconView: View { /// icon for the step indicator public var image:Image diff --git a/Sources/StepperView/Views/Indicators/IndicatorView.swift b/Sources/StepperView/Views/Indicators/IndicatorView.swift index 7bb0313..05f4853 100644 --- a/Sources/StepperView/Views/Indicators/IndicatorView.swift +++ b/Sources/StepperView/Views/Indicators/IndicatorView.swift @@ -9,7 +9,6 @@ import SwiftUI // MARK: - Indicator View for Stepper Indicator /// A `View ` for Step Indicator -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct IndicatorView: View { /// state variable to hold width to render `View` when values changes @State private var width:CGFloat = 0.0 diff --git a/Sources/StepperView/Views/Indicators/NumberedCircleView.swift b/Sources/StepperView/Views/Indicators/NumberedCircleView.swift index ca32176..b0f37a5 100644 --- a/Sources/StepperView/Views/Indicators/NumberedCircleView.swift +++ b/Sources/StepperView/Views/Indicators/NumberedCircleView.swift @@ -8,7 +8,6 @@ import SwiftUI /// Circle view with text inside for Step Indicator -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public struct NumberedCircleView: View { /// text to be paced inside the circle var text:String @@ -46,7 +45,6 @@ public struct NumberedCircleView: View { } /// circles around the border with progress -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct AnimatedCircle: View { /// text to be paced inside the circle var text:String diff --git a/Sources/StepperView/Views/Lines/HorizontalLineView.swift b/Sources/StepperView/Views/Lines/HorizontalLineView.swift index b410a9d..0e84540 100644 --- a/Sources/StepperView/Views/Lines/HorizontalLineView.swift +++ b/Sources/StepperView/Views/Lines/HorizontalLineView.swift @@ -8,7 +8,6 @@ import SwiftUI /// Horizontal Line View for Step Indictor -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct HorizontalLineView: View { /// binding variable to hold the divider width @Binding var dividerWidth: CGFloat diff --git a/Sources/StepperView/Views/Lines/PitStopLineView.swift b/Sources/StepperView/Views/Lines/PitStopLineView.swift index ae18b23..efe59d5 100644 --- a/Sources/StepperView/Views/Lines/PitStopLineView.swift +++ b/Sources/StepperView/Views/Lines/PitStopLineView.swift @@ -8,7 +8,6 @@ import SwiftUI /// pitstop Line View for each of the step indicator -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct PitStopLineView: View { /// options for customizing pitstop line with either `defaults` or custom `width` and `Color` var options:StepperLineOptions diff --git a/Sources/StepperView/Views/Lines/VerticalLineView.swift b/Sources/StepperView/Views/Lines/VerticalLineView.swift index 6326d04..8fd54e6 100644 --- a/Sources/StepperView/Views/Lines/VerticalLineView.swift +++ b/Sources/StepperView/Views/Lines/VerticalLineView.swift @@ -8,7 +8,6 @@ import SwiftUI /// Vertical Line View for Step Indictor -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct VerticalLineView: View { /// binding variable to hold lineHeight @Binding var lineHeight:CGFloat diff --git a/Sources/StepperView/Views/PitStopView.swift b/Sources/StepperView/Views/PitStopView.swift index 92a93be..f7381ab 100644 --- a/Sources/StepperView/Views/PitStopView.swift +++ b/Sources/StepperView/Views/PitStopView.swift @@ -8,7 +8,6 @@ import SwiftUI /// A View for setting up a pitstop for eg: line with a `circle` or `custom` view -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct PitStopView: View { /// state variable to hold width to render `View` when values changes @State private var width:CGFloat = 0.0 diff --git a/Sources/StepperView/Views/StepIndicatorHorizontalView.swift b/Sources/StepperView/Views/StepIndicatorHorizontalView.swift index 1f1b301..9fb323a 100644 --- a/Sources/StepperView/Views/StepIndicatorHorizontalView.swift +++ b/Sources/StepperView/Views/StepIndicatorHorizontalView.swift @@ -10,7 +10,6 @@ import SwiftUI /// A Step Indications View in `horizontal` direction /// /// creates step indicator view either in `horizontal` mode -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct StepIndicatorHorizontalView: View { /// state variable to hold width to render `View` when values changes @State private var lineWidth:CGFloat = 0 diff --git a/Sources/StepperView/Views/StepIndicatorVerticalView.swift b/Sources/StepperView/Views/StepIndicatorVerticalView.swift index 607eea8..8364413 100644 --- a/Sources/StepperView/Views/StepIndicatorVerticalView.swift +++ b/Sources/StepperView/Views/StepIndicatorVerticalView.swift @@ -10,7 +10,6 @@ import SwiftUI /// A Step Indications View in `vertical` direction /// /// creates step indicator view either in `vertical` mode -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) struct StepIndicatorVerticalView: View where Cell:View { //vertical mode elements /// state variable to hold height of line to render `View` when values changes @@ -136,7 +135,6 @@ struct StepIndicatorVerticalView: View where Cell:View { } // MARK: - Helper methods to construct step indicator vertical view. -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) extension StepIndicatorVerticalView { /// Calculate intermediate heights of the view. diff --git a/Sources/StepperView/Views/StepperAIBuilder.swift b/Sources/StepperView/Views/StepperAIBuilder.swift new file mode 100644 index 0000000..e210f9b --- /dev/null +++ b/Sources/StepperView/Views/StepperAIBuilder.swift @@ -0,0 +1,267 @@ +// +// StepperAIBuilder.swift +// StepperView_Example +// +// Created on 2/15/26. +// + +import SwiftUI + +#if canImport(FoundationModels) + +@available(iOS 26.0, *) +struct StepperAIBuilder { + + // MARK: - Color Mapping + + static func color(from name: String) -> Color { + // Try named colors first + switch name.lowercased() { + case "teal": return Colors.teal.rawValue + case "red": return Colors.red(.normal).rawValue + case "green": return Colors.green(.normal).rawValue + case "blue": return Colors.blue(.teal).rawValue + case "orange": return Colors.orange.rawValue + case "lavender": return Colors.lavendar.rawValue + case "cyan": return Colors.cyan.rawValue + case "black": return Colors.black.rawValue + case "yellow": return Colors.yellow(.regular).rawValue + case "polar": return Colors.polar.rawValue + default: + break + } + // Try hex color (e.g. "#FF6B35" or "FF6B35") + if let hexColor = Color(hex: name) { + return hexColor + } + return Colors.teal.rawValue + } + + /// Checks whether a color string is a hex value (as opposed to a named color). + static func isHexColor(_ name: String) -> Bool { + let trimmed = name.hasPrefix("#") ? String(name.dropFirst()) : name + return trimmed.count == 6 && trimmed.allSatisfy(\.isHexDigit) + } + + // MARK: - Indicator Mapping + + private static let validSymbols: Set = Set(StepperAIConfig.validSFSymbols) + + private static let indicatorSize: CGFloat = StepperAIConfig.defaults.indicatorSize + + static func indicator(for step: GeneratedStep) -> StepperIndicationType { + let stepColor = color(from: step.color) + + switch step.indicatorType.lowercased() { + case "numberedcircle": + return .custom( + NumberedCircleView(text: "\(step.stepNumber)", width: indicatorSize, color: stepColor) + .eraseToAnyView() + ) + case "sfsymbol": + let requested = step.sfSymbolName ?? "circle.fill" + let symbolName = validSymbols.contains(requested) ? requested : "checkmark.circle.fill" + return .custom( + CircledIconView(image: Image(systemName: symbolName), + width: indicatorSize, + strokeColor: stepColor) + .eraseToAnyView() + ) + case "circle": + return .custom( + CircledIconView(image: Image(systemName: "circle.fill"), + width: indicatorSize, + color: stepColor, + strokeColor: stepColor) + .eraseToAnyView() + ) + default: + return .custom( + CircledIconView(image: Image(systemName: "circle.fill"), + width: indicatorSize, + color: stepColor, + strokeColor: stepColor) + .eraseToAnyView() + ) + } + } + + // MARK: - Code Generation + + static func generateCode(from config: GeneratedStepperConfig) -> String { + let steps = config.steps.sorted { $0.stepNumber < $1.stepNumber } + let hasPitStops = steps.contains { $0.pitStopText != nil && !$0.pitStopText!.isEmpty } + + var code = "import SwiftUI\nimport StepperView\n\n" + code += "struct Generated\(config.title.replacingOccurrences(of: " ", with: ""))View: View {\n\n" + + // Steps array + code += " let steps = [\n" + for (i, step) in steps.enumerated() { + let comma = i < steps.count - 1 ? "," : "" + code += " TextView(text: \"\(step.title)\", font: .system(size: 14, weight: .semibold))\(comma)\n" + } + code += " ]\n\n" + + // Indicators array + code += " let indicators = [\n" + for (i, step) in steps.enumerated() { + let comma = i < steps.count - 1 ? "," : "" + let colorCode = colorCodeString(from: step.color) + switch step.indicatorType.lowercased() { + case "numberedcircle": + code += " StepperIndicationType.custom(\n" + code += " NumberedCircleView(text: \"\(step.stepNumber)\", width: 40, color: \(colorCode))\n" + code += " .eraseToAnyView())\(comma)\n" + case "sfsymbol": + let requested = step.sfSymbolName ?? "circle.fill" + let symbolName = validSymbols.contains(requested) ? requested : "checkmark.circle.fill" + code += " StepperIndicationType.custom(\n" + code += " CircledIconView(image: Image(systemName: \"\(symbolName)\"),\n" + code += " width: 40,\n" + code += " strokeColor: \(colorCode))\n" + code += " .eraseToAnyView())\(comma)\n" + default: + code += " StepperIndicationType.custom(\n" + code += " CircledIconView(image: Image(systemName: \"circle.fill\"),\n" + code += " width: 40,\n" + code += " color: \(colorCode),\n" + code += " strokeColor: \(colorCode))\n" + code += " .eraseToAnyView())\(comma)\n" + } + } + code += " ]\n\n" + + // Pit stops + if hasPitStops { + code += " let pitStops = [\n" + for (i, step) in steps.enumerated() { + let comma = i < steps.count - 1 ? "," : "" + let text = step.pitStopText ?? " " + code += " TextView(text: \"\(text)\").eraseToAnyView()\(comma)\n" + } + code += " ]\n\n" + + code += " let pitStopLines = [\n" + for (i, step) in steps.enumerated() { + let comma = i < steps.count - 1 ? "," : "" + let colorCode = colorCodeString(from: step.color) + code += " StepperLineOptions.custom(1, \(colorCode))\(comma)\n" + } + code += " ]\n\n" + } + + // Body + code += " var body: some View {\n" + code += " StepperView()\n" + code += " .addSteps(steps)\n" + code += " .indicators(indicators)\n" + + // Life cycles + let lcValues = steps.map { $0.lifeCycle.lowercased() == "completed" ? ".completed" : ".pending" } + code += " .stepLifeCycles([\(lcValues.joined(separator: ", "))])\n" + + if hasPitStops { + code += " .addPitStops(pitStops)\n" + code += " .pitStopLineOptions(pitStopLines)\n" + code += " .stepIndicatorMode(.\(config.mode.lowercased()))\n" + code += " .autoSpacing(true)\n" + } else { + let lineColorCode = steps.first.map { colorCodeString(from: $0.color) } ?? "Colors.teal.rawValue" + let isHorizontal = config.mode.lowercased() == "horizontal" + if isHorizontal { + code += " .lineOptions(StepperLineOptions.rounded(2, 4, \(lineColorCode)))\n" + } else { + code += " .lineOptions(StepperLineOptions.custom(2, \(lineColorCode)))\n" + } + code += " .stepIndicatorMode(.\(config.mode.lowercased()))\n" + code += " .spacing(\(isHorizontal ? 70 : Int(config.spacing)))\n" + } + + code += " }\n" + code += "}\n" + + return code + } + + private static func colorCodeString(from name: String) -> String { + switch name.lowercased() { + case "teal": return "Colors.teal.rawValue" + case "red": return "Colors.red(.normal).rawValue" + case "green": return "Colors.green(.normal).rawValue" + case "blue": return "Colors.blue(.teal).rawValue" + case "orange": return "Colors.orange.rawValue" + case "lavender": return "Colors.lavendar.rawValue" + case "cyan": return "Colors.cyan.rawValue" + case "black": return "Colors.black.rawValue" + case "yellow": return "Colors.yellow(.regular).rawValue" + case "polar": return "Colors.polar.rawValue" + default: + // Hex color → generate Color(hex:) initializer in code output + if isHexColor(name) { + let hex = name.hasPrefix("#") ? name : "#\(name)" + return "Color(hex: \"\(hex)\")!" + } + return "Colors.teal.rawValue" + } + } + + // MARK: - Build StepperView + + @ViewBuilder + public static func buildStepperView(from config: GeneratedStepperConfig) -> some View { + let steps = config.steps.sorted { $0.stepNumber < $1.stepNumber } + + let stepViews = steps.map { step in + TextView(text: step.title, font: .system(size: 14, weight: .semibold)) + } + + let indicators = steps.map { step in + indicator(for: step) + } + + let lifeCycles = steps.map { step in + step.lifeCycle.lowercased() == "completed" ? StepLifeCycle.completed : StepLifeCycle.pending + } + + let hasPitStops = steps.contains { $0.pitStopText != nil && !$0.pitStopText!.isEmpty } + + if hasPitStops { + // Ensure every step has pit stop content; use a space placeholder for nil entries + // so the pit stop array count matches and connector lines render properly. + let pitStops = steps.map { step in + TextView(text: (step.pitStopText ?? "").isEmpty ? " " : step.pitStopText!, + font: .caption) + .eraseToAnyView() + } + + let pitStopLines = steps.map { step in + StepperLineOptions.custom(1, color(from: step.color)) + } + + StepperView() + .addSteps(stepViews) + .indicators(indicators) + .stepLifeCycles(lifeCycles) + .addPitStops(pitStops) + .pitStopLineOptions(pitStopLines) + .stepIndicatorMode(config.mode.lowercased() == "horizontal" ? .horizontal : .vertical) + .autoSpacing(true) + } else { + let lineColor = steps.first.map { color(from: $0.color) } ?? Colors.teal.rawValue + let isHorizontal = config.mode.lowercased() == "horizontal" + let lineOption = isHorizontal + ? StepperLineOptions.rounded(2, 4, lineColor) + : StepperLineOptions.custom(2, lineColor) + StepperView() + .addSteps(stepViews) + .indicators(indicators) + .stepLifeCycles(lifeCycles) + .lineOptions(lineOption) + .stepIndicatorMode(isHorizontal ? .horizontal : .vertical) + .spacing(isHorizontal ? 70 : CGFloat(config.spacing)) + } + } +} + +#endif diff --git a/Sources/StepperView/Views/StepperView.swift b/Sources/StepperView/Views/StepperView.swift index 886252b..b5b85d7 100644 --- a/Sources/StepperView/Views/StepperView.swift +++ b/Sources/StepperView/Views/StepperView.swift @@ -10,7 +10,6 @@ import SwiftUI /// A View for Step Indications. /// /// You create step indicator view either in `vertical` or `horizontal` mode -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public struct StepperView: View { /// contains list of steps to be rendered next to Indicators @Environment(\.steps) var steps @@ -58,7 +57,6 @@ public struct StepperView: View { case bottoom ```` */ -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public enum StepperAlignment: String, CaseIterable { /// aligns step Indicator to top case top = "Top" @@ -77,7 +75,6 @@ public enum StepperAlignment: String, CaseIterable { case custom(Content) ```` */ -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public enum StepperIndicationType { /// alias to `Width` public typealias Width = CGFloat @@ -99,7 +96,6 @@ public enum StepperIndicationType { case custom(CGFloat, Color) ```` */ -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) public enum StepperLineOptions { /// default line option case defaults diff --git a/StepperView.podspec b/StepperView.podspec index c7ec2b7..5cb985a 100644 --- a/StepperView.podspec +++ b/StepperView.podspec @@ -8,17 +8,26 @@ Pod::Spec.new do |s| s.name = 'StepperView' - s.version = '1.6.7' - s.swift_version = '5.0' + s.version = '2.0' + s.swift_version = '5.9' s.summary = 'SwiftUI iOS component for Step Indications.' s.description = 'Stepper View Indication componet for SwiftUI' s.homepage = 'https://github.com/badrinathvm/StepperView' s.license = { :type => 'MIT', :file => 'LICENSE' } - s.author = { 'badrinathvm' => 'badrinathvm@gmail.com' } s.source = { :git => 'https://github.com/badrinathvm/StepperView.git', :tag => s.version.to_s } s.social_media_url = 'https://twitter.com/badrivm' - s.ios.deployment_target = '11.0' - s.watchos.deployment_target = '6.0' + s.ios.deployment_target = '13.0' + s.watchos.deployment_target = '7.0' s.macos.deployment_target = '10.15' s.source_files = 'Sources/**/*.swift' + + # Yams + YAML resources only on iOS and macOS (not supported on watchOS) + s.ios.dependency 'Yams', '~> 5.0' + s.macos.dependency 'Yams', '~> 5.0' + s.ios.resource_bundles = { + 'StepperView' => ['Sources/StepperView/Resources/**/*.yaml'] + } + s.macos.resource_bundles = { + 'StepperView' => ['Sources/StepperView/Resources/**/*.yaml'] + } end diff --git a/Tests/StepperViewTests/StepperViewTests.swift b/Tests/StepperViewTests/StepperViewTests.swift index 521dbd4..9a0af8c 100644 --- a/Tests/StepperViewTests/StepperViewTests.swift +++ b/Tests/StepperViewTests/StepperViewTests.swift @@ -2,7 +2,6 @@ import XCTest import SwiftUI @testable import StepperView -@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *) final class StepperViewTests: XCTestCase { func testStepAlignment() { diff --git a/images/ai_stepper_generator.gif b/images/ai_stepper_generator.gif new file mode 100644 index 0000000..83f11c7 Binary files /dev/null and b/images/ai_stepper_generator.gif differ