From 81bdd72478e44a5617f6e38e39f42f19f0bd3e0b Mon Sep 17 00:00:00 2001 From: ibrahimlawal Date: Thu, 3 Mar 2016 21:42:50 +0100 Subject: [PATCH] Initial Release --- .clang-format | 58 + .github/CONTRIBUTING.md | 25 + .github/ISSUE_TEMPLATE.md | 21 + .github/PULL_REQUEST_TEMPLATE.md | 7 + .gitignore | 27 + .travis.yml | 25 + CHANGELOG | 5 + Example/Default-568h@2x.png | Bin 0 -> 272438 bytes .../Paystack iOS Application Tests/Info.plist | 24 + .../PSTCKPaymentCardTextFieldUITests.m | 115 ++ ...ck iOS Application Tests-Bridging-Header.h | 4 + .../project.pbxproj | 464 ++++++ .../Paystack iOS Application Tests.xcscheme | 56 + .../Paystack iOS Example (Simple).xcscheme | 101 ++ .../Paystack iOS Example/AppDelegate.swift | 25 + .../Base.lproj/Main.storyboard | 116 ++ .../AppIcon.appiconset/Contents.json | 38 + .../Images.xcassets/Contents.json | 6 + .../LaunchImage.launchimage/Contents.json | 23 + .../caps.imageset/Contents.json | 33 + .../caps.imageset/paystack-cap-1.jpg | Bin 0 -> 222251 bytes .../caps.imageset/paystack-cap.jpg | Bin 0 -> 222251 bytes Example/Paystack iOS Example/Info.plist | 40 + .../Paystack iOS Example.entitlements | 5 + .../Paystack iOS Example/ViewController.swift | 153 ++ GUIDE.md | 253 +++ LICENSE | 21 + Paystack.podspec | 31 + Paystack.xcodeproj/project.pbxproj | 1369 +++++++++++++++++ .../xcschemes/PaystackOSX Tests.xcscheme | 99 ++ .../xcschemes/PaystackOSX.xcscheme | 113 ++ .../xcschemes/PaystackiOS Tests.xcscheme | 99 ++ .../xcschemes/PaystackiOS.xcscheme | 80 + .../PaystackiOSStaticFramework.xcscheme | 80 + Paystack.xcworkspace/contents.xcworkspacedata | 10 + .../xcshareddata/Paystack.xccheckout | 53 + .../PaystackOSX-Debug.xcconfig | 11 + .../PaystackOSX-Release.xcconfig | 22 + .../PaystackOSX-Shared.xcconfig | 186 +++ .../PaystackOSXTests-Debug.xcconfig | 11 + .../PaystackOSXTests-Release.xcconfig | 22 + .../PaystackOSXTests-Shared.xcconfig | 122 ++ .../PaystackiOS Tests-Debug.xcconfig | 11 + .../PaystackiOS Tests-Release.xcconfig | 12 + .../PaystackiOS Tests-Shared.xcconfig | 92 ++ .../PaystackiOS-Debug.xcconfig | 11 + .../PaystackiOS-Release.xcconfig | 10 + .../PaystackiOS-Shared.xcconfig | 167 ++ .../PaystackiOSStatic.xcconfig | 99 ++ .../PaystackiOSStaticFramework.xcconfig | 19 + .../Project-Debug.xcconfig | 48 + .../Project-Release.xcconfig | 41 + .../Project-Shared.xcconfig | 130 ++ Paystack/Fabric/FABKitProtocol.h | 46 + Paystack/Fabric/Fabric+FABKits.h | 25 + Paystack/Fabric/Fabric.h | 53 + Paystack/Info.plist | 24 + Paystack/NSDictionary+Paystack.h | 14 + Paystack/NSDictionary+Paystack.m | 27 + Paystack/PSTCKAPIClient+Private.h | 16 + Paystack/PSTCKAPIClient.m | 240 +++ Paystack/PSTCKAPIPostRequest.h | 18 + Paystack/PSTCKAPIPostRequest.m | 53 + Paystack/PSTCKCard.m | 142 ++ Paystack/PSTCKCardParams.m | 183 +++ Paystack/PSTCKCardValidator.m | 296 ++++ Paystack/PSTCKCategoryLoader.h | 16 + Paystack/PSTCKCategoryLoader.m | 21 + Paystack/PSTCKFormEncoder.h | 19 + Paystack/PSTCKFormEncoder.m | 188 +++ Paystack/PSTCKToken.m | 94 ++ Paystack/PaystackError.m | 109 ++ Paystack/PublicHeaders/PSTCKAPIClient.h | 135 ++ .../PublicHeaders/PSTCKAPIResponseDecodable.h | 25 + Paystack/PublicHeaders/PSTCKCard.h | 122 ++ Paystack/PublicHeaders/PSTCKCardBrand.h | 19 + Paystack/PublicHeaders/PSTCKCardParams.h | 92 ++ .../PublicHeaders/PSTCKCardValidationState.h | 15 + Paystack/PublicHeaders/PSTCKCardValidator.h | 103 ++ Paystack/PublicHeaders/PSTCKFormEncodable.h | 32 + Paystack/PublicHeaders/PSTCKToken.h | 33 + Paystack/PublicHeaders/Paystack.h | 23 + Paystack/PublicHeaders/PaystackError.h | 68 + .../UI/PSTCKPaymentCardTextField.h | 238 +++ Paystack/PublicHeaders/UI/UIImage+Paystack.h | 25 + Paystack/RSA/PSTCKRSA.h | 14 + Paystack/RSA/PSTCKRSA.m | 149 ++ Paystack/Resources/Images/pstck_card_amex.png | Bin 0 -> 659 bytes .../Resources/Images/pstck_card_amex@2x.png | Bin 0 -> 1062 bytes .../Resources/Images/pstck_card_amex@3x.png | Bin 0 -> 1523 bytes Paystack/Resources/Images/pstck_card_cvc.png | Bin 0 -> 764 bytes .../Resources/Images/pstck_card_cvc@2x.png | Bin 0 -> 1537 bytes .../Resources/Images/pstck_card_cvc@3x.png | Bin 0 -> 2221 bytes .../Resources/Images/pstck_card_cvc_amex.png | Bin 0 -> 750 bytes .../Images/pstck_card_cvc_amex@2x.png | Bin 0 -> 1515 bytes .../Images/pstck_card_cvc_amex@3x.png | Bin 0 -> 2226 bytes .../Resources/Images/pstck_card_diners.png | Bin 0 -> 730 bytes .../Resources/Images/pstck_card_diners@2x.png | Bin 0 -> 1101 bytes .../Resources/Images/pstck_card_diners@3x.png | Bin 0 -> 1592 bytes .../Resources/Images/pstck_card_discover.png | Bin 0 -> 721 bytes .../Images/pstck_card_discover@2x.png | Bin 0 -> 1224 bytes .../Images/pstck_card_discover@3x.png | Bin 0 -> 1770 bytes Paystack/Resources/Images/pstck_card_jcb.png | Bin 0 -> 555 bytes .../Resources/Images/pstck_card_jcb@2x.png | Bin 0 -> 897 bytes .../Resources/Images/pstck_card_jcb@3x.png | Bin 0 -> 1369 bytes .../Images/pstck_card_mastercard.png | Bin 0 -> 944 bytes .../Images/pstck_card_mastercard@2x.png | Bin 0 -> 2018 bytes .../Images/pstck_card_mastercard@3x.png | Bin 0 -> 3236 bytes .../Images/pstck_card_placeholder.png | Bin 0 -> 727 bytes .../Images/pstck_card_placeholder@2x.png | Bin 0 -> 967 bytes .../Images/pstck_card_placeholder@3x.png | Bin 0 -> 473 bytes .../pstck_card_placeholder_template.png | Bin 0 -> 674 bytes .../pstck_card_placeholder_template@2x.png | Bin 0 -> 399 bytes .../pstck_card_placeholder_template@3x.png | Bin 0 -> 516 bytes Paystack/Resources/Images/pstck_card_visa.png | Bin 0 -> 650 bytes .../Resources/Images/pstck_card_visa@2x.png | Bin 0 -> 1071 bytes .../Resources/Images/pstck_card_visa@3x.png | Bin 0 -> 1542 bytes Paystack/UI/PSTCKFormTextField.h | 28 + Paystack/UI/PSTCKFormTextField.m | 145 ++ Paystack/UI/PSTCKPaymentCardTextField.m | 734 +++++++++ .../UI/PSTCKPaymentCardTextFieldViewModel.h | 34 + .../UI/PSTCKPaymentCardTextFieldViewModel.m | 119 ++ Paystack/UI/UIImage+Paystack.m | 93 ++ Paystack/module.modulemap | 5 + README.md | 65 + Tests/OSX Tests/Info.plist | 24 + Tests/Tests/Info.plist | 24 + Tests/Tests/PSTCKAPIClientTest.m | 25 + Tests/Tests/PSTCKCardFunctionalTest.m | 94 ++ Tests/Tests/PSTCKCardTest.m | 106 ++ Tests/Tests/PSTCKCardValidatorTest.m | 240 +++ Tests/Tests/PSTCKCertTest.m | 73 + Tests/Tests/PSTCKFormEncoderTest.m | 109 ++ Tests/Tests/PSTCKPaymentCardTextFieldTest.m | 241 +++ .../PSTCKPaymentCardTextFieldViewModelTest.m | 95 ++ Tests/Tests/PSTCKRSATest.m | 43 + Tests/Tests/PSTCKTokenTest.m | 39 + Tests/Tests/UIImage+PaystackTest.m | 59 + Tests/iOS Tests/Info.plist | 24 + .../CarthageTest.xcodeproj/project.pbxproj | 439 ++++++ .../xcschemes/CarthageTest.xcscheme | 112 ++ .../carthage/CarthageTest/AppDelegate.swift | 43 + .../CarthageTest/Base.lproj/LaunchScreen.xib | 41 + .../CarthageTest/Base.lproj/Main.storyboard | 25 + .../AppIcon.appiconset/Contents.json | 38 + .../carthage/CarthageTest/Info.plist | 40 + .../CarthageTest/ViewController.swift | 25 + .../CarthageTestTests/CarthageTestTests.swift | 33 + .../carthage/CarthageTestTests/Info.plist | 24 + Tests/installation_tests/carthage/test.sh | 19 + .../CocoapodsTest.xcodeproj/project.pbxproj | 503 ++++++ .../xcschemes/CocoapodsTest.xcscheme | 112 ++ .../contents.xcworkspacedata | 10 + .../xcshareddata/CocoapodsTest.xccheckout | 41 + .../CocoapodsTest/AppDelegate.swift | 43 + .../CocoapodsTest/Base.lproj/LaunchScreen.xib | 41 + .../CocoapodsTest/Base.lproj/Main.storyboard | 25 + .../AppIcon.appiconset/Contents.json | 38 + .../with_frameworks/CocoapodsTest/Info.plist | 40 + .../CocoapodsTest/ViewController.swift | 24 + .../CocoapodsTestTests.swift | 33 + .../CocoapodsTestTests/Info.plist | 24 + .../cocoapods/with_frameworks/Podfile | 3 + .../cocoapods/with_frameworks/test.sh | 8 + .../CocoapodsTest.xcodeproj/project.pbxproj | 512 ++++++ .../xcschemes/CocoapodsTest.xcscheme | 112 ++ .../contents.xcworkspacedata | 10 + .../xcshareddata/CocoapodsTest.xccheckout | 41 + .../CocoapodsTest/AppDelegate.h | 14 + .../CocoapodsTest/AppDelegate.m | 42 + .../CocoapodsTest/Base.lproj/LaunchScreen.xib | 41 + .../CocoapodsTest/Base.lproj/Main.storyboard | 25 + .../AppIcon.appiconset/Contents.json | 38 + .../CocoapodsTest/Info.plist | 40 + .../CocoapodsTest/ViewController.h | 12 + .../CocoapodsTest/ViewController.m | 27 + .../without_frameworks/CocoapodsTest/main.m | 13 + .../CocoapodsTestTests/CocoapodsTestTests.m | 37 + .../CocoapodsTestTests/Info.plist | 24 + .../cocoapods/without_frameworks/Podfile | 8 + .../cocoapods/without_frameworks/test.sh | 8 + .../project.pbxproj | 447 ++++++ .../xcschemes/ManualInstallationTest.xcscheme | 112 ++ .../ManualInstallationTest/AppDelegate.h | 14 + .../ManualInstallationTest/AppDelegate.m | 45 + .../Base.lproj/LaunchScreen.xib | 41 + .../Base.lproj/Main.storyboard | 25 + .../AppIcon.appiconset/Contents.json | 38 + .../ManualInstallationTest/Info.plist | 40 + .../ManualInstallationTest/ViewController.h | 12 + .../ManualInstallationTest/ViewController.m | 24 + .../ManualInstallationTest/main.m | 13 + .../ManualInstallationTestTests/Info.plist | 24 + .../ManualInstallationTestTests.m | 37 + .../manual_installation/test.sh | 18 + VERSION | 1 + ci_scripts/FauxPasConfig/main.fauxpas.json | 840 ++++++++++ ci_scripts/check_fauxpas.sh | 9 + ci_scripts/check_version.rb | 20 + ci_scripts/export_builds.sh | 21 + ci_scripts/install_fauxpas.sh | 11 + 201 files changed, 14269 insertions(+) create mode 100644 .clang-format create mode 100644 .github/CONTRIBUTING.md create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 CHANGELOG create mode 100644 Example/Default-568h@2x.png create mode 100644 Example/Paystack iOS Application Tests/Info.plist create mode 100644 Example/Paystack iOS Application Tests/PSTCKPaymentCardTextFieldUITests.m create mode 100644 Example/Paystack iOS Application Tests/Paystack iOS Application Tests-Bridging-Header.h create mode 100644 Example/Paystack iOS Example.xcodeproj/project.pbxproj create mode 100644 Example/Paystack iOS Example.xcodeproj/xcshareddata/xcschemes/Paystack iOS Application Tests.xcscheme create mode 100644 Example/Paystack iOS Example.xcodeproj/xcshareddata/xcschemes/Paystack iOS Example (Simple).xcscheme create mode 100644 Example/Paystack iOS Example/AppDelegate.swift create mode 100644 Example/Paystack iOS Example/Base.lproj/Main.storyboard create mode 100644 Example/Paystack iOS Example/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Example/Paystack iOS Example/Images.xcassets/Contents.json create mode 100644 Example/Paystack iOS Example/Images.xcassets/LaunchImage.launchimage/Contents.json create mode 100644 Example/Paystack iOS Example/Images.xcassets/caps.imageset/Contents.json create mode 100644 Example/Paystack iOS Example/Images.xcassets/caps.imageset/paystack-cap-1.jpg create mode 100644 Example/Paystack iOS Example/Images.xcassets/caps.imageset/paystack-cap.jpg create mode 100644 Example/Paystack iOS Example/Info.plist create mode 100644 Example/Paystack iOS Example/Paystack iOS Example.entitlements create mode 100644 Example/Paystack iOS Example/ViewController.swift create mode 100644 GUIDE.md create mode 100644 LICENSE create mode 100644 Paystack.podspec create mode 100644 Paystack.xcodeproj/project.pbxproj create mode 100644 Paystack.xcodeproj/xcshareddata/xcschemes/PaystackOSX Tests.xcscheme create mode 100644 Paystack.xcodeproj/xcshareddata/xcschemes/PaystackOSX.xcscheme create mode 100644 Paystack.xcodeproj/xcshareddata/xcschemes/PaystackiOS Tests.xcscheme create mode 100644 Paystack.xcodeproj/xcshareddata/xcschemes/PaystackiOS.xcscheme create mode 100644 Paystack.xcodeproj/xcshareddata/xcschemes/PaystackiOSStaticFramework.xcscheme create mode 100644 Paystack.xcworkspace/contents.xcworkspacedata create mode 100644 Paystack.xcworkspace/xcshareddata/Paystack.xccheckout create mode 100644 Paystack/BuildConfigurations/PaystackOSX-Debug.xcconfig create mode 100644 Paystack/BuildConfigurations/PaystackOSX-Release.xcconfig create mode 100644 Paystack/BuildConfigurations/PaystackOSX-Shared.xcconfig create mode 100644 Paystack/BuildConfigurations/PaystackOSXTests-Debug.xcconfig create mode 100644 Paystack/BuildConfigurations/PaystackOSXTests-Release.xcconfig create mode 100644 Paystack/BuildConfigurations/PaystackOSXTests-Shared.xcconfig create mode 100644 Paystack/BuildConfigurations/PaystackiOS Tests-Debug.xcconfig create mode 100644 Paystack/BuildConfigurations/PaystackiOS Tests-Release.xcconfig create mode 100644 Paystack/BuildConfigurations/PaystackiOS Tests-Shared.xcconfig create mode 100644 Paystack/BuildConfigurations/PaystackiOS-Debug.xcconfig create mode 100644 Paystack/BuildConfigurations/PaystackiOS-Release.xcconfig create mode 100644 Paystack/BuildConfigurations/PaystackiOS-Shared.xcconfig create mode 100644 Paystack/BuildConfigurations/PaystackiOSStatic.xcconfig create mode 100644 Paystack/BuildConfigurations/PaystackiOSStaticFramework.xcconfig create mode 100644 Paystack/BuildConfigurations/Project-Debug.xcconfig create mode 100644 Paystack/BuildConfigurations/Project-Release.xcconfig create mode 100644 Paystack/BuildConfigurations/Project-Shared.xcconfig create mode 100644 Paystack/Fabric/FABKitProtocol.h create mode 100644 Paystack/Fabric/Fabric+FABKits.h create mode 100644 Paystack/Fabric/Fabric.h create mode 100644 Paystack/Info.plist create mode 100644 Paystack/NSDictionary+Paystack.h create mode 100644 Paystack/NSDictionary+Paystack.m create mode 100644 Paystack/PSTCKAPIClient+Private.h create mode 100644 Paystack/PSTCKAPIClient.m create mode 100644 Paystack/PSTCKAPIPostRequest.h create mode 100644 Paystack/PSTCKAPIPostRequest.m create mode 100644 Paystack/PSTCKCard.m create mode 100644 Paystack/PSTCKCardParams.m create mode 100644 Paystack/PSTCKCardValidator.m create mode 100644 Paystack/PSTCKCategoryLoader.h create mode 100644 Paystack/PSTCKCategoryLoader.m create mode 100644 Paystack/PSTCKFormEncoder.h create mode 100644 Paystack/PSTCKFormEncoder.m create mode 100644 Paystack/PSTCKToken.m create mode 100644 Paystack/PaystackError.m create mode 100644 Paystack/PublicHeaders/PSTCKAPIClient.h create mode 100644 Paystack/PublicHeaders/PSTCKAPIResponseDecodable.h create mode 100644 Paystack/PublicHeaders/PSTCKCard.h create mode 100644 Paystack/PublicHeaders/PSTCKCardBrand.h create mode 100644 Paystack/PublicHeaders/PSTCKCardParams.h create mode 100644 Paystack/PublicHeaders/PSTCKCardValidationState.h create mode 100644 Paystack/PublicHeaders/PSTCKCardValidator.h create mode 100644 Paystack/PublicHeaders/PSTCKFormEncodable.h create mode 100644 Paystack/PublicHeaders/PSTCKToken.h create mode 100644 Paystack/PublicHeaders/Paystack.h create mode 100644 Paystack/PublicHeaders/PaystackError.h create mode 100644 Paystack/PublicHeaders/UI/PSTCKPaymentCardTextField.h create mode 100644 Paystack/PublicHeaders/UI/UIImage+Paystack.h create mode 100644 Paystack/RSA/PSTCKRSA.h create mode 100644 Paystack/RSA/PSTCKRSA.m create mode 100644 Paystack/Resources/Images/pstck_card_amex.png create mode 100644 Paystack/Resources/Images/pstck_card_amex@2x.png create mode 100644 Paystack/Resources/Images/pstck_card_amex@3x.png create mode 100644 Paystack/Resources/Images/pstck_card_cvc.png create mode 100644 Paystack/Resources/Images/pstck_card_cvc@2x.png create mode 100644 Paystack/Resources/Images/pstck_card_cvc@3x.png create mode 100644 Paystack/Resources/Images/pstck_card_cvc_amex.png create mode 100644 Paystack/Resources/Images/pstck_card_cvc_amex@2x.png create mode 100644 Paystack/Resources/Images/pstck_card_cvc_amex@3x.png create mode 100644 Paystack/Resources/Images/pstck_card_diners.png create mode 100644 Paystack/Resources/Images/pstck_card_diners@2x.png create mode 100644 Paystack/Resources/Images/pstck_card_diners@3x.png create mode 100644 Paystack/Resources/Images/pstck_card_discover.png create mode 100644 Paystack/Resources/Images/pstck_card_discover@2x.png create mode 100644 Paystack/Resources/Images/pstck_card_discover@3x.png create mode 100644 Paystack/Resources/Images/pstck_card_jcb.png create mode 100644 Paystack/Resources/Images/pstck_card_jcb@2x.png create mode 100644 Paystack/Resources/Images/pstck_card_jcb@3x.png create mode 100644 Paystack/Resources/Images/pstck_card_mastercard.png create mode 100644 Paystack/Resources/Images/pstck_card_mastercard@2x.png create mode 100644 Paystack/Resources/Images/pstck_card_mastercard@3x.png create mode 100644 Paystack/Resources/Images/pstck_card_placeholder.png create mode 100644 Paystack/Resources/Images/pstck_card_placeholder@2x.png create mode 100644 Paystack/Resources/Images/pstck_card_placeholder@3x.png create mode 100644 Paystack/Resources/Images/pstck_card_placeholder_template.png create mode 100644 Paystack/Resources/Images/pstck_card_placeholder_template@2x.png create mode 100644 Paystack/Resources/Images/pstck_card_placeholder_template@3x.png create mode 100644 Paystack/Resources/Images/pstck_card_visa.png create mode 100644 Paystack/Resources/Images/pstck_card_visa@2x.png create mode 100644 Paystack/Resources/Images/pstck_card_visa@3x.png create mode 100644 Paystack/UI/PSTCKFormTextField.h create mode 100644 Paystack/UI/PSTCKFormTextField.m create mode 100644 Paystack/UI/PSTCKPaymentCardTextField.m create mode 100644 Paystack/UI/PSTCKPaymentCardTextFieldViewModel.h create mode 100644 Paystack/UI/PSTCKPaymentCardTextFieldViewModel.m create mode 100644 Paystack/UI/UIImage+Paystack.m create mode 100644 Paystack/module.modulemap create mode 100644 README.md create mode 100644 Tests/OSX Tests/Info.plist create mode 100644 Tests/Tests/Info.plist create mode 100644 Tests/Tests/PSTCKAPIClientTest.m create mode 100644 Tests/Tests/PSTCKCardFunctionalTest.m create mode 100644 Tests/Tests/PSTCKCardTest.m create mode 100644 Tests/Tests/PSTCKCardValidatorTest.m create mode 100644 Tests/Tests/PSTCKCertTest.m create mode 100644 Tests/Tests/PSTCKFormEncoderTest.m create mode 100644 Tests/Tests/PSTCKPaymentCardTextFieldTest.m create mode 100644 Tests/Tests/PSTCKPaymentCardTextFieldViewModelTest.m create mode 100644 Tests/Tests/PSTCKRSATest.m create mode 100644 Tests/Tests/PSTCKTokenTest.m create mode 100644 Tests/Tests/UIImage+PaystackTest.m create mode 100644 Tests/iOS Tests/Info.plist create mode 100644 Tests/installation_tests/carthage/CarthageTest.xcodeproj/project.pbxproj create mode 100644 Tests/installation_tests/carthage/CarthageTest.xcodeproj/xcshareddata/xcschemes/CarthageTest.xcscheme create mode 100644 Tests/installation_tests/carthage/CarthageTest/AppDelegate.swift create mode 100644 Tests/installation_tests/carthage/CarthageTest/Base.lproj/LaunchScreen.xib create mode 100644 Tests/installation_tests/carthage/CarthageTest/Base.lproj/Main.storyboard create mode 100644 Tests/installation_tests/carthage/CarthageTest/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Tests/installation_tests/carthage/CarthageTest/Info.plist create mode 100644 Tests/installation_tests/carthage/CarthageTest/ViewController.swift create mode 100644 Tests/installation_tests/carthage/CarthageTestTests/CarthageTestTests.swift create mode 100644 Tests/installation_tests/carthage/CarthageTestTests/Info.plist create mode 100755 Tests/installation_tests/carthage/test.sh create mode 100644 Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest.xcodeproj/project.pbxproj create mode 100644 Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest.xcodeproj/xcshareddata/xcschemes/CocoapodsTest.xcscheme create mode 100644 Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest.xcworkspace/contents.xcworkspacedata create mode 100644 Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest.xcworkspace/xcshareddata/CocoapodsTest.xccheckout create mode 100644 Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest/AppDelegate.swift create mode 100644 Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest/Base.lproj/LaunchScreen.xib create mode 100644 Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest/Base.lproj/Main.storyboard create mode 100644 Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest/Info.plist create mode 100644 Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest/ViewController.swift create mode 100644 Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTestTests/CocoapodsTestTests.swift create mode 100644 Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTestTests/Info.plist create mode 100644 Tests/installation_tests/cocoapods/with_frameworks/Podfile create mode 100755 Tests/installation_tests/cocoapods/with_frameworks/test.sh create mode 100644 Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest.xcodeproj/project.pbxproj create mode 100644 Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest.xcodeproj/xcshareddata/xcschemes/CocoapodsTest.xcscheme create mode 100644 Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest.xcworkspace/contents.xcworkspacedata create mode 100644 Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest.xcworkspace/xcshareddata/CocoapodsTest.xccheckout create mode 100644 Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/AppDelegate.h create mode 100644 Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/AppDelegate.m create mode 100644 Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/Base.lproj/LaunchScreen.xib create mode 100644 Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/Base.lproj/Main.storyboard create mode 100644 Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/Info.plist create mode 100644 Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/ViewController.h create mode 100644 Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/ViewController.m create mode 100644 Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/main.m create mode 100644 Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTestTests/CocoapodsTestTests.m create mode 100644 Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTestTests/Info.plist create mode 100644 Tests/installation_tests/cocoapods/without_frameworks/Podfile create mode 100755 Tests/installation_tests/cocoapods/without_frameworks/test.sh create mode 100644 Tests/installation_tests/manual_installation/ManualInstallationTest.xcodeproj/project.pbxproj create mode 100644 Tests/installation_tests/manual_installation/ManualInstallationTest.xcodeproj/xcshareddata/xcschemes/ManualInstallationTest.xcscheme create mode 100644 Tests/installation_tests/manual_installation/ManualInstallationTest/AppDelegate.h create mode 100644 Tests/installation_tests/manual_installation/ManualInstallationTest/AppDelegate.m create mode 100644 Tests/installation_tests/manual_installation/ManualInstallationTest/Base.lproj/LaunchScreen.xib create mode 100644 Tests/installation_tests/manual_installation/ManualInstallationTest/Base.lproj/Main.storyboard create mode 100644 Tests/installation_tests/manual_installation/ManualInstallationTest/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Tests/installation_tests/manual_installation/ManualInstallationTest/Info.plist create mode 100644 Tests/installation_tests/manual_installation/ManualInstallationTest/ViewController.h create mode 100644 Tests/installation_tests/manual_installation/ManualInstallationTest/ViewController.m create mode 100644 Tests/installation_tests/manual_installation/ManualInstallationTest/main.m create mode 100644 Tests/installation_tests/manual_installation/ManualInstallationTestTests/Info.plist create mode 100644 Tests/installation_tests/manual_installation/ManualInstallationTestTests/ManualInstallationTestTests.m create mode 100755 Tests/installation_tests/manual_installation/test.sh create mode 100644 VERSION create mode 100644 ci_scripts/FauxPasConfig/main.fauxpas.json create mode 100755 ci_scripts/check_fauxpas.sh create mode 100755 ci_scripts/check_version.rb create mode 100755 ci_scripts/export_builds.sh create mode 100755 ci_scripts/install_fauxpas.sh diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..4a7afd3 --- /dev/null +++ b/.clang-format @@ -0,0 +1,58 @@ +--- +Language: Cpp +# BasedOnStyle: LLVM +AccessModifierOffset: -2 +ConstructorInitializerIndentWidth: 4 +AlignEscapedNewlinesLeft: false +AlignTrailingComments: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortBlocksOnASingleLine: false +AllowShortIfStatementsOnASingleLine: false +AllowShortLoopsOnASingleLine: false +AllowShortFunctionsOnASingleLine: All +AlwaysBreakTemplateDeclarations: false +AlwaysBreakBeforeMultilineStrings: false +BreakBeforeBinaryOperators: false +BreakBeforeBraces: Attach +BreakBeforeTernaryOperators: false +BreakConstructorInitializersBeforeComma: false +BinPackParameters: false +BinPackParameters: false +ColumnLimit: 160 +CommentPragmas: '^ IWYU pragma:' +ConstructorInitializerAllOnOneLineOrOnePerLine: false +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DerivePointerAlignment: true +DisableFormat: false +ExperimentalAutoDetectBinPacking: true +ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ] +IndentCaseLabels: false +IndentWidth: 4 +IndentWrappedFunctionNames: false +IndentFunctionDeclarationAfterType: false +MaxEmptyLinesToKeep: 1 +KeepEmptyLinesAtTheStartOfBlocks: false +NamespaceIndentation: None +ObjCSpaceAfterProperty: true +ObjCSpaceBeforeProtocolList: false +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakString: 1000 +PenaltyBreakFirstLessLess: 120 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 60 +PointerAlignment: Right +SpaceBeforeAssignmentOperators: true +SpaceBeforeParens: ControlStatements +SpacesInAngles: false +SpacesInContainerLiterals: false +SpacesInCStyleCastParentheses: false +SpaceInEmptyParentheses: false +SpacesInParentheses: false +SpacesBeforeTrailingComments: 1 +Standard: Cpp11 +TabWidth: 8 +UseTab: Never +... + diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md new file mode 100644 index 0000000..f26ea40 --- /dev/null +++ b/.github/CONTRIBUTING.md @@ -0,0 +1,25 @@ +# Contributing + +Contributions are **welcome** and will be fully **credited**. + +We accept contributions via Pull Requests. + + +## Pull Requests + +- **Document any change in behaviour** - Make sure the `README.md` and any other relevant documentation are kept up-to-date. + +- **Create feature branches** - Don't ask us to pull from your master branch. + +- **One pull request per feature** - If you want to do more than one thing, send multiple pull requests. + +- **Send coherent history** - Make sure each individual commit in your pull request is meaningful. If you had to make multiple intermediate commits while developing, please [squash them](http://www.git-scm.com/book/en/v2/Git-Tools-Rewriting-History#Changing-Multiple-Commit-Messages) before submitting. + + +## Running Tests + +TODO: Include Code for runnning tests in this project +``` bash +``` + +**Happy coding**! diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..168b850 --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,21 @@ +# Problem/Motivation +(Why the issue was filed, steps to reproduce the problem, etc.) + +## Proposed resolution +(Description of the proposed solution, the rationale behind it, and workarounds for people who cannot use the patch.) + +## Repeatable +Always|Sometimes|Specific conditions|Specific times + +(If it is a bug, you are reporting lease specify:) + +## Steps to repeat: (Describe how the issue can be repeated by someone who is to work on it) +1. Step 1 +2. Step 2 +3. ... + +## Expected Results: +(What you expected steps 1, 2 and 3 to give) + +## Actual Results: +(What is gave including any error messages, memory dump etc that can help) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..af060ce --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,7 @@ +Fixes #0 (Enter the number for the issue this fixes. If you have not yet created an issue, please do so now or delete this line if you are only submitting a patch) + +## Changes made by this pull request +- +- +- + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2a0603b --- /dev/null +++ b/.gitignore @@ -0,0 +1,27 @@ +build/* +Tests/build/* +Tests/installation_tests/cocoapods/**/Podfile.lock +Tests/installation_tests/cocoapods/**/Pods +Tests/installation_tests/manual_installation/build +Tests/installation_tests/manual_installation/ManualInstallationTest/Frameworks/Paystack.framework +Tests/installation_tests/carthage/Cartfile +Tests/installation_tests/carthage/Cartfile.resolved +Tests/installation_tests/carthage/Carthage/* + +*.pbxuser +*.mode1v3 +*.mode2v3 +*.perspectivev3 +*.swp +*.moved-aside +*.xcscmblueprint +.idea + +.DS_Store +profile +DerivedData + +xcuserdata + +project.xcworkspace + diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..3e75154 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,25 @@ +language: objective-c +osx_image: xcode7 + +env: + global: + secure: gZMOaHQIeG7nplBCuH7EKf9o6Ez2rtoSskrv3nOTziSxFfZq322MrxvkidDpEN7AKWYQm27FO+tCzgq0slXb578lQ9P5ySDwEdExKtk/jMtKsBsf3cr4dzSMiqV5D5TbsH2jE9HQlpYUoJeoMBicR2XsTmd7wiu2jAzNBFqGfiY= + +before_install: + - brew install carthage + - gem update cocoapods --no-ri --no-rdoc + - gem install xcpretty --no-ri --no-rdoc + - ./ci_scripts/install_fauxpas.sh + +script: + - "./ci_scripts/check_fauxpas.sh" + - "./ci_scripts/check_version.rb" + - set -o pipefail && xcodebuild test -workspace Paystack.xcworkspace -scheme "PaystackiOS Tests" -configuration Debug -sdk iphonesimulator | xcpretty -c + - set -o pipefail && xcodebuild test -workspace Paystack.xcworkspace -scheme "Paystack iOS Application Tests" -configuration Debug -sdk iphonesimulator -destination "OS=9.0,name=iPhone 6" | xcpretty -c + - set -o pipefail && xcodebuild test -workspace Paystack.xcworkspace -scheme "PaystackOSX Tests" | xcpretty -c + - set -o pipefail && xcodebuild build -workspace Paystack.xcworkspace -scheme "Paystack iOS Example (Simple)" -sdk iphonesimulator | xcpretty -c + - set -o pipefail && xcodebuild build -workspace Paystack.xcworkspace -scheme "Paystack iOS Example (Custom)" -sdk iphonesimulator | xcpretty -c + - "./Tests/installation_tests/cocoapods/with_frameworks/test.sh" + - "./Tests/installation_tests/cocoapods/without_frameworks/test.sh" + - "./Tests/installation_tests/manual_installation/test.sh" + # - "./Tests/installation_tests/carthage/test.sh" diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 0000000..c66148f --- /dev/null +++ b/CHANGELOG @@ -0,0 +1,5 @@ +=== 1.0.0 2016-03-03 + +* Initial release + +Special thanks to: the Stripe iOS team. This was built based on their library at http://github.com/stripe/stripe-ios . diff --git a/Example/Default-568h@2x.png b/Example/Default-568h@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..205a2cbf5a10973f5d863b6f2d8ae91357971a37 GIT binary patch literal 272438 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

PeFugD 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

ghWcEr8Kt+Pl`0*+Y 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

tU4 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 literal 0 HcmV?d00001 diff --git a/Example/Paystack iOS Application Tests/Info.plist b/Example/Paystack iOS Application Tests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/Example/Paystack iOS Application Tests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Example/Paystack iOS Application Tests/PSTCKPaymentCardTextFieldUITests.m b/Example/Paystack iOS Application Tests/PSTCKPaymentCardTextFieldUITests.m new file mode 100644 index 0000000..f6aa664 --- /dev/null +++ b/Example/Paystack iOS Application Tests/PSTCKPaymentCardTextFieldUITests.m @@ -0,0 +1,115 @@ +// +// PSTCKPaymentCardTextFieldUITests.m +// Paystack iOS Example +// +// + +#import +#import + +@interface PSTCKPaymentCardTextField (Testing) +@property(nonatomic, readwrite, weak)UIImageView *brandImageView; +@property(nonatomic, readwrite, weak)UITextField *numberField; +@property(nonatomic, readwrite, weak)UITextField *expirationField; +@property(nonatomic, readwrite, weak)UITextField *cvcField; +@property(nonatomic, assign)BOOL numberFieldShrunk; ++ (UIImage *)cvcImageForCardBrand:(PSTCKCardBrand)cardBrand; ++ (UIImage *)brandImageForCardBrand:(PSTCKCardBrand)cardBrand; +@end + +@interface PSTCKPaymentCardTextFieldUITests : XCTestCase +@property (nonatomic, strong) PSTCKPaymentCardTextField *sut; +@property (nonatomic, strong) UIViewController *viewController; +@end + +@implementation PSTCKPaymentCardTextFieldUITests + +- (void)setUp { + [super setUp]; + self.viewController = [UIViewController new]; + self.sut = [PSTCKPaymentCardTextField new]; + [self.viewController.view addSubview:self.sut]; + UIWindow *window = [[UIApplication sharedApplication] keyWindow]; + window.rootViewController = self.viewController; +} + +- (void)testSetCard_allFields_whileEditingNumber { + XCTAssertTrue([self.sut.numberField becomeFirstResponder]); + PSTCKCardParams *card = [PSTCKCardParams new]; + NSString *number = @"4123450131001381"; + NSString *cvc = @"883"; + card.number = number; + card.expMonth = 10; + card.expYear = 99; + card.cvc = cvc; + [self.sut setCardParams:card]; + NSData *imgData = UIImagePNGRepresentation(self.sut.brandImageView.image); + NSData *expectedImgData = UIImagePNGRepresentation([PSTCKPaymentCardTextField cvcImageForCardBrand:PSTCKCardBrandVisa]); + + XCTAssertTrue(self.sut.numberFieldShrunk); + XCTAssertTrue([expectedImgData isEqualToData:imgData]); + XCTAssertEqualObjects(self.sut.numberField.text, number); + XCTAssertEqualObjects(self.sut.expirationField.text, @"10/99"); + XCTAssertEqualObjects(self.sut.cvcField.text, cvc); + XCTAssertTrue([self.sut.cvcField isFirstResponder]); + XCTAssertTrue(self.sut.isValid); +} + +- (void)testSetCard_partialNumberAndExpiration_whileEditingExpiration { + XCTAssertTrue([self.sut.expirationField becomeFirstResponder]); + PSTCKCardParams *card = [PSTCKCardParams new]; + NSString *number = @"41"; + card.number = number; + card.expMonth = 10; + card.expYear = 99; + [self.sut setCardParams:card]; + NSData *imgData = UIImagePNGRepresentation(self.sut.brandImageView.image); + NSData *expectedImgData = UIImagePNGRepresentation([PSTCKPaymentCardTextField brandImageForCardBrand:PSTCKCardBrandVisa]); + + XCTAssertFalse(self.sut.numberFieldShrunk); + XCTAssertTrue([expectedImgData isEqualToData:imgData]); + XCTAssertEqualObjects(self.sut.numberField.text, number); + XCTAssertEqualObjects(self.sut.expirationField.text, @"10/99"); + XCTAssertEqual(self.sut.cvcField.text.length, (NSUInteger)0); + XCTAssertTrue([self.sut.expirationField isFirstResponder]); + XCTAssertFalse(self.sut.isValid); +} + +- (void)testSetCard_number_whileEditingCVC { + XCTAssertTrue([self.sut.cvcField becomeFirstResponder]); + PSTCKCardParams *card = [PSTCKCardParams new]; + NSString *number = @"4123450131001381"; + card.number = number; + [self.sut setCardParams:card]; + NSData *imgData = UIImagePNGRepresentation(self.sut.brandImageView.image); + NSData *expectedImgData = UIImagePNGRepresentation([PSTCKPaymentCardTextField brandImageForCardBrand:PSTCKCardBrandVisa]); + + XCTAssertTrue(self.sut.numberFieldShrunk); + XCTAssertTrue([expectedImgData isEqualToData:imgData]); + XCTAssertEqualObjects(self.sut.numberField.text, number); + XCTAssertEqual(self.sut.expirationField.text.length, (NSUInteger)0); + XCTAssertEqual(self.sut.cvcField.text.length, (NSUInteger)0); + XCTAssertTrue([self.sut.expirationField isFirstResponder]); + XCTAssertFalse(self.sut.isValid); +} + +- (void)testSetCard_empty_whileEditingNumber { + XCTAssertTrue([self.sut.numberField becomeFirstResponder]); + self.sut.numberField.text = @"4123450131001381"; + self.sut.cvcField.text = @"883"; + self.sut.expirationField.text = @"10/99"; + PSTCKCardParams *card = [PSTCKCardParams new]; + [self.sut setCardParams:card]; + NSData *imgData = UIImagePNGRepresentation(self.sut.brandImageView.image); + NSData *expectedImgData = UIImagePNGRepresentation([PSTCKPaymentCardTextField brandImageForCardBrand:PSTCKCardBrandUnknown]); + + XCTAssertFalse(self.sut.numberFieldShrunk); + XCTAssertTrue([expectedImgData isEqualToData:imgData]); + XCTAssertEqual(self.sut.numberField.text.length, (NSUInteger)0); + XCTAssertEqual(self.sut.expirationField.text.length, (NSUInteger)0); + XCTAssertEqual(self.sut.cvcField.text.length, (NSUInteger)0); + XCTAssertTrue([self.sut.numberField isFirstResponder]); + XCTAssertFalse(self.sut.isValid); +} + +@end diff --git a/Example/Paystack iOS Application Tests/Paystack iOS Application Tests-Bridging-Header.h b/Example/Paystack iOS Application Tests/Paystack iOS Application Tests-Bridging-Header.h new file mode 100644 index 0000000..1b2cb5d --- /dev/null +++ b/Example/Paystack iOS Application Tests/Paystack iOS Application Tests-Bridging-Header.h @@ -0,0 +1,4 @@ +// +// Use this file to import your target's public headers that you would like to expose to Swift. +// + diff --git a/Example/Paystack iOS Example.xcodeproj/project.pbxproj b/Example/Paystack iOS Example.xcodeproj/project.pbxproj new file mode 100644 index 0000000..e3ffbde --- /dev/null +++ b/Example/Paystack iOS Example.xcodeproj/project.pbxproj @@ -0,0 +1,464 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 042CA41D1A685E8D00D778E7 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 042CA4141A685E8D00D778E7 /* AppDelegate.swift */; }; + 042CA41F1A685E8D00D778E7 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 042CA4171A685E8D00D778E7 /* Main.storyboard */; }; + 042CA4201A685E8D00D778E7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 042CA4191A685E8D00D778E7 /* Images.xcassets */; }; + 042CA4221A685E8D00D778E7 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 042CA41C1A685E8D00D778E7 /* ViewController.swift */; }; + 10500ABA1C8140EE00EEF7CF /* Paystack.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 10500AB91C8140EE00EEF7CF /* Paystack.framework */; }; + 10A653A71C88CFBC00EBC974 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 10A653A61C88CFBC00EBC974 /* Default-568h@2x.png */; }; + 10FC52021C88D40A004A0733 /* Paystack iOS Example.entitlements in Resources */ = {isa = PBXBuildFile; fileRef = 10FC52011C88D40A004A0733 /* Paystack iOS Example.entitlements */; }; + C11745DF1C456D6D0029936F /* PSTCKPaymentCardTextFieldUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = C11745DE1C456D6D0029936F /* PSTCKPaymentCardTextFieldUITests.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + C11745D81C456C730029936F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 04823F701A6849200098400B /* Project object */; + proxyType = 1; + remoteGlobalIDString = 04823F771A6849200098400B; + remoteInfo = "Paystack iOS Example (Simple)"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 042CA4141A685E8D00D778E7 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 042CA4181A685E8D00D778E7 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 042CA4191A685E8D00D778E7 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 042CA41A1A685E8D00D778E7 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 042CA41C1A685E8D00D778E7 /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 04823F781A6849200098400B /* Paystack iOS Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Paystack iOS Example.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 10500AB91C8140EE00EEF7CF /* Paystack.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Paystack.framework; path = "../../../../../Library/Developer/Xcode/DerivedData/Paystack-eocshxmtrugnoohigtzntpokkqyc/Build/Products/Debug-iphoneos/Paystack.framework"; sourceTree = ""; }; + 10A653A61C88CFBC00EBC974 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; + 10FC52011C88D40A004A0733 /* Paystack iOS Example.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xml; path = "Paystack iOS Example.entitlements"; sourceTree = ""; }; + C11745D31C456C730029936F /* Paystack iOS Application Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Paystack iOS Application Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + C11745D71C456C730029936F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C11745DD1C456D6D0029936F /* Paystack iOS Application Tests-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Paystack iOS Application Tests-Bridging-Header.h"; sourceTree = ""; }; + C11745DE1C456D6D0029936F /* PSTCKPaymentCardTextFieldUITests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSTCKPaymentCardTextFieldUITests.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 04823F751A6849200098400B /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 10500ABA1C8140EE00EEF7CF /* Paystack.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C11745D01C456C730029936F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 042CA4131A685E8D00D778E7 /* Paystack iOS Example */ = { + isa = PBXGroup; + children = ( + 10FC52011C88D40A004A0733 /* Paystack iOS Example.entitlements */, + 042CA41A1A685E8D00D778E7 /* Info.plist */, + 042CA4141A685E8D00D778E7 /* AppDelegate.swift */, + 042CA41C1A685E8D00D778E7 /* ViewController.swift */, + 042CA4191A685E8D00D778E7 /* Images.xcassets */, + 042CA4171A685E8D00D778E7 /* Main.storyboard */, + ); + path = "Paystack iOS Example"; + sourceTree = ""; + }; + 04823F6F1A6849200098400B = { + isa = PBXGroup; + children = ( + 10A653A61C88CFBC00EBC974 /* Default-568h@2x.png */, + 042CA4131A685E8D00D778E7 /* Paystack iOS Example */, + C11745D41C456C730029936F /* Paystack iOS Application Tests */, + 04823F9F1A6849850098400B /* Frameworks */, + 04823F791A6849200098400B /* Products */, + ); + sourceTree = ""; + }; + 04823F791A6849200098400B /* Products */ = { + isa = PBXGroup; + children = ( + 04823F781A6849200098400B /* Paystack iOS Example.app */, + C11745D31C456C730029936F /* Paystack iOS Application Tests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 04823F9F1A6849850098400B /* Frameworks */ = { + isa = PBXGroup; + children = ( + 10500AB91C8140EE00EEF7CF /* Paystack.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + C11745D41C456C730029936F /* Paystack iOS Application Tests */ = { + isa = PBXGroup; + children = ( + C11745DE1C456D6D0029936F /* PSTCKPaymentCardTextFieldUITests.m */, + C11745D71C456C730029936F /* Info.plist */, + C11745DD1C456D6D0029936F /* Paystack iOS Application Tests-Bridging-Header.h */, + ); + path = "Paystack iOS Application Tests"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 04823F771A6849200098400B /* Paystack iOS Example */ = { + isa = PBXNativeTarget; + buildConfigurationList = 04823F971A6849200098400B /* Build configuration list for PBXNativeTarget "Paystack iOS Example" */; + buildPhases = ( + 04823F741A6849200098400B /* Sources */, + 04823F751A6849200098400B /* Frameworks */, + 04823F761A6849200098400B /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Paystack iOS Example"; + productName = "Paystack iOS Exampe (Simple)"; + productReference = 04823F781A6849200098400B /* Paystack iOS Example.app */; + productType = "com.apple.product-type.application"; + }; + C11745D21C456C730029936F /* Paystack iOS Application Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = C11745DC1C456C730029936F /* Build configuration list for PBXNativeTarget "Paystack iOS Application Tests" */; + buildPhases = ( + C11745CF1C456C730029936F /* Sources */, + C11745D01C456C730029936F /* Frameworks */, + C11745D11C456C730029936F /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + C11745D91C456C730029936F /* PBXTargetDependency */, + ); + name = "Paystack iOS Application Tests"; + productName = "Paystack iOS Application Tests"; + productReference = C11745D31C456C730029936F /* Paystack iOS Application Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 04823F701A6849200098400B /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0720; + LastUpgradeCheck = 0710; + ORGANIZATIONNAME = Paystack; + TargetAttributes = { + 04823F771A6849200098400B = { + CreatedOnToolsVersion = 6.1.1; + DevelopmentTeam = VZCEZ65JNX; + SystemCapabilities = { + com.apple.InterAppAudio = { + enabled = 0; + }; + com.apple.Keychain = { + enabled = 0; + }; + com.apple.OMC = { + enabled = 1; + }; + com.apple.Passbook = { + enabled = 0; + }; + }; + }; + C11745D21C456C730029936F = { + CreatedOnToolsVersion = 7.2; + TestTargetID = 04823F771A6849200098400B; + }; + }; + }; + buildConfigurationList = 04823F731A6849200098400B /* Build configuration list for PBXProject "Paystack iOS Example" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 04823F6F1A6849200098400B; + productRefGroup = 04823F791A6849200098400B /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 04823F771A6849200098400B /* Paystack iOS Example */, + C11745D21C456C730029936F /* Paystack iOS Application Tests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 04823F761A6849200098400B /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 042CA4201A685E8D00D778E7 /* Images.xcassets in Resources */, + 042CA41F1A685E8D00D778E7 /* Main.storyboard in Resources */, + 10FC52021C88D40A004A0733 /* Paystack iOS Example.entitlements in Resources */, + 10A653A71C88CFBC00EBC974 /* Default-568h@2x.png in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C11745D11C456C730029936F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 04823F741A6849200098400B /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 042CA4221A685E8D00D778E7 /* ViewController.swift in Sources */, + 042CA41D1A685E8D00D778E7 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + C11745CF1C456C730029936F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C11745DF1C456D6D0029936F /* PSTCKPaymentCardTextFieldUITests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + C11745D91C456C730029936F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 04823F771A6849200098400B /* Paystack iOS Example */; + targetProxy = C11745D81C456C730029936F /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 042CA4171A685E8D00D778E7 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 042CA4181A685E8D00D778E7 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 04823F951A6849200098400B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OBJC_BRIDGING_HEADER = "Paystack iOS Example (Simple)/Paystack iOS Example (Simple)-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 04823F961A6849200098400B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OBJC_BRIDGING_HEADER = "Paystack iOS Example (Simple)/Paystack iOS Example (Simple)-Bridging-Header.h"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 04823F981A6849200098400B /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + ); + GCC_TREAT_WARNINGS_AS_ERRORS = YES; + INFOPLIST_FILE = "$(SRCROOT)/Paystack iOS Example/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.paystack.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "Paystack iOS Example"; + PROVISIONING_PROFILE = ""; + SWIFT_OBJC_BRIDGING_HEADER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 04823F991A6849200098400B /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + ); + GCC_TREAT_WARNINGS_AS_ERRORS = YES; + INFOPLIST_FILE = "$(SRCROOT)/Paystack iOS Example/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.paystack.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "Paystack iOS Example"; + PROVISIONING_PROFILE = ""; + SWIFT_OBJC_BRIDGING_HEADER = ""; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + C11745DA1C456C730029936F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ENABLE_MODULES = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "Paystack iOS Application Tests/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 9.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.paystack.Paystack-iOS-Application-Tests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Paystack iOS Application Tests/Paystack iOS Application Tests-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Paystack iOS Example.app/Paystack iOS Example"; + }; + name = Debug; + }; + C11745DB1C456C730029936F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_ENABLE_MODULES = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "Paystack iOS Application Tests/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 9.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.paystack.Paystack-iOS-Application-Tests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Paystack iOS Application Tests/Paystack iOS Application Tests-Bridging-Header.h"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Paystack iOS Example.app/Paystack iOS Example"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 04823F731A6849200098400B /* Build configuration list for PBXProject "Paystack iOS Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 04823F951A6849200098400B /* Debug */, + 04823F961A6849200098400B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 04823F971A6849200098400B /* Build configuration list for PBXNativeTarget "Paystack iOS Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 04823F981A6849200098400B /* Debug */, + 04823F991A6849200098400B /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C11745DC1C456C730029936F /* Build configuration list for PBXNativeTarget "Paystack iOS Application Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C11745DA1C456C730029936F /* Debug */, + C11745DB1C456C730029936F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 04823F701A6849200098400B /* Project object */; +} diff --git a/Example/Paystack iOS Example.xcodeproj/xcshareddata/xcschemes/Paystack iOS Application Tests.xcscheme b/Example/Paystack iOS Example.xcodeproj/xcshareddata/xcschemes/Paystack iOS Application Tests.xcscheme new file mode 100644 index 0000000..dd5dae7 --- /dev/null +++ b/Example/Paystack iOS Example.xcodeproj/xcshareddata/xcschemes/Paystack iOS Application Tests.xcscheme @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/Paystack iOS Example.xcodeproj/xcshareddata/xcschemes/Paystack iOS Example (Simple).xcscheme b/Example/Paystack iOS Example.xcodeproj/xcshareddata/xcschemes/Paystack iOS Example (Simple).xcscheme new file mode 100644 index 0000000..8ac20e5 --- /dev/null +++ b/Example/Paystack iOS Example.xcodeproj/xcshareddata/xcschemes/Paystack iOS Example (Simple).xcscheme @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/Paystack iOS Example/AppDelegate.swift b/Example/Paystack iOS Example/AppDelegate.swift new file mode 100644 index 0000000..7dc7270 --- /dev/null +++ b/Example/Paystack iOS Example/AppDelegate.swift @@ -0,0 +1,25 @@ +// +// AppDelegate.swift +// Paystack iOS Exampe (Simple) +// + +import UIKit + +extension String { + var isEmail: Bool { + let emailRegEx = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}" + let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx) + return emailTest.evaluateWithObject(self) + } +} + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + return true + } + +} + diff --git a/Example/Paystack iOS Example/Base.lproj/Main.storyboard b/Example/Paystack iOS Example/Base.lproj/Main.storyboard new file mode 100644 index 0000000..5887e03 --- /dev/null +++ b/Example/Paystack iOS Example/Base.lproj/Main.storyboard @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/Paystack iOS Example/Images.xcassets/AppIcon.appiconset/Contents.json b/Example/Paystack iOS Example/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..118c98f --- /dev/null +++ b/Example/Paystack iOS Example/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,38 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/Paystack iOS Example/Images.xcassets/Contents.json b/Example/Paystack iOS Example/Images.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Example/Paystack iOS Example/Images.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/Paystack iOS Example/Images.xcassets/LaunchImage.launchimage/Contents.json b/Example/Paystack iOS Example/Images.xcassets/LaunchImage.launchimage/Contents.json new file mode 100644 index 0000000..c79ebd3 --- /dev/null +++ b/Example/Paystack iOS Example/Images.xcassets/LaunchImage.launchimage/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "orientation" : "portrait", + "idiom" : "iphone", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + }, + { + "orientation" : "portrait", + "idiom" : "iphone", + "subtype" : "retina4", + "extent" : "full-screen", + "minimum-system-version" : "7.0", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Example/Paystack iOS Example/Images.xcassets/caps.imageset/Contents.json b/Example/Paystack iOS Example/Images.xcassets/caps.imageset/Contents.json new file mode 100644 index 0000000..5f5eea1 --- /dev/null +++ b/Example/Paystack iOS Example/Images.xcassets/caps.imageset/Contents.json @@ -0,0 +1,33 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "filename" : "paystack-cap.jpg", + "scale" : "1x" + }, + { + "idiom" : "iphone", + "filename" : "paystack-cap-1.jpg", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "original" + } +} \ No newline at end of file diff --git a/Example/Paystack iOS Example/Images.xcassets/caps.imageset/paystack-cap-1.jpg b/Example/Paystack iOS Example/Images.xcassets/caps.imageset/paystack-cap-1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..544d8d810e4f683e93049e2ecd5a77391856e67f GIT binary patch literal 222251 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­(g*iwKV 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%0A?S zc>CeHRF@Q%+9VN>L7h9;t4jw)MVq9(Ra1xAQQ2vOTJ>egU!Cm!MQ{{%1 z)}L@1){Ke-Y#zoSJ!wo_<*q74u%hRQRFLTbN?R3@yldB2QbnIP^3|OjbSvGqA#Hk( zU8b?V!E*`AQlf8Al#}oicV@QNa@M)rbU>567f4n5IVZ8^e~jyXLTz`|H;$W-?1eZb zSUjEgNXPVh-_NTRu8kFL0eb||QM*spl)290MZa^}j>KBNUVVF5El@AoQ+ibM94BREX- z@wjccE$~ai3SVpU$LFl7_|D%HxdER6=$y8;xF2KVG(Ny8;@8&}NB^XWAP5FJEgz}JP{s1{59*jdyjdx1jCl{)o1Iaym-@o(kt@!KSj1Hgs?FgW6L zqn)5nd*_jg9PgIc4ES18mcuUJXXa+XBDI1yc6Z{U+cu*xg!nsBSF*K;q|B~w&DCqD zy@-pwTu<2rzLR|YuC-Am7jD}6O)(&9H=NGTMfq(%RGC9X`DtZ(CHD&ExSIT1A}`@*qlVgUg**{Wu6%=Cfa6ATq96kkqAUWS2i67Jr8Cd6A<= zSb<)Hxn1sN*4>-|M`1w-*Mh)u)n+Gwe9|us_{naCD4@_GXN1IV@mxBTxpJ>}wp}J5jGU&DNNUgMgCa zTG}^Gd((mWZH34@kyq`?)33Xw0tAAnB7~7bK0H=;|E{S2HeqjFz&Ti6Kz+^v2J#BB z-8EQ?3$V}afwEi<6(JkaTk~gcvUs>+!&kCpX2Z4gg z;a#$nMDfF8wBz4eV<&;;V?sG6084{BZ$#@<2&}IHK1s96|EnX{wFI1ppuOBR-GJ$V z$UaY!Qe6x1A7DzKk}9wraS?)cW$4!A*aeI|6vJ!HPJm3@;hG1XP&E6}4(?#$do{?Q zeYV)v_p3=A2>o()rvi^OShc2?8b-@EW?=aZedz(k}*#v7)>E&=0)lt%}#{H^BR#;7{}52J>y;BH?hd3 z9F!+ArqHu%BOt{$w}4y@W=fZ@g`&WaNSE018+%>i0@|}8cwQ)|SJ5tNUE#Q|i%(qK z+<;wRI%(h?Rx~3$H!sXpYO;{jtL3BaiiThDM^ckxe8s%an`AkbUHj|ov_UBIXLX$6jx!0( z^8vq_D0uF*+ih$BEGn{mz4t8!cI>=%%5N8za!z%k9srxPU#f1nS0@s^FMm^a;CgLR>kRpahvIMF21pyT~$ zV=odu>bj`~SLL9Mssdc#I;uSTY><|nUwIrms1?esX&W5tP8xjVq%rqo;_RtH*R_j& zcR%@1{OOh>l|plfj8w-BR*i`=JEfyWs&I5-<%L%daJ!8d(G5v&Pj%$J>{flhM$*D4 zm@MF*lbRuIIriHCaf#0j>C4L(Pz7r#ej)Z(MwPdM|3JAIZl=LEEq;mq{@nfGKLC-x zoP>CxY57G9HSeAIr=g`-Dmb={qbzf-Cp2CBb&@ohmIXyFN=}pH4b*7;ymY{Z$tCsQ zmDI~_l%~AaSAFWY)5;LZq)*%oKBU4oo$cqVt}hKe9Xgc3r>!zK?CU~wHm_>1)|c`0 zsf3F7u3X^AbYb8&77#oWb;O ziAI~t6@nl%j=H$?vs}Szkd#Xb?tz=0AdrzF89b&gl5<`f8Hh28OiiQDsY>V^V3Pf54JjReS zReKoB;{ZaNrBDNPc^gi=*D(b;s$44ONSDAcr7s^RAaI`9--;vSU(*5YXwhF?D0qff z9}Sb(Zzc4de66OgHU&g2opA@^k1}&j&h`Hsn7KlLXO3d^I6+_HXZlD2P@GZ8QkpSX zbbx(5zRzIl%NfER&}4G=Cyj~0pbcP@4U^yqq47|YAOAiuOfs&Xx;)AkQIHa;KPNX$ zC9yXvL9{c=(_dRrUB&xR`zpFKao&*a?qkRI!{@Ci!d=`l((EWK?8=P!WM?QQ_xmmTh96VhVc-Pm5aJ%~HJ2>!l8gs0tTeC%kNN|AR`AppPq!sk?bNiYx=J z9eutEv(S!Kd&&kj(KUov%qXW=b6xTkJb~uB(1!-l#^b~8EQZ^~N)tFBT^|G?VrbJz zw{OB+`8PC07A7=#lCOx}TP(Lh%CUDKZg{SKe<_#jt(cMr0fFEg5Q$v8AxPWWfo`!7e;Z zXD_@yw9Eez6Ay(zObkeTGkS2dgT9b)y=hsfyg^Zf&w9oKV6WNPC5BUSH0za4nypy* zNc(h1nSYW%gbp38=3(8NyNM}mxX#h?Ff~c`M5TuR<_Be}lbcB)2$7aklyB-9>7v`M z={TXZV2)Rq2E&|4Xm**=@fYE8d(eS2j-aB|$GD+|)9h_?)92i#CS7Y{!S1;#KAK1L zcu!Z7t#kAG81myFOtK*f>2#BNsD4S1*rdaA&tGBn3dSqUXdv3R|Btw^>S$MNDJ(Dy!08*G^eCT@)nA6+2G z$yRM%mg`J_H!Qe(h?zly+X_(8C{5o~t(`*#^+!^>CKS7B>k%J5c!`#hHm+2JZtqg24zv>lya&^T5S6OK8DTXZQ^3{6FT&a&AN;5d zz4H&C#?~B==o#E8!SaZ};}2)iMqt~C0ldXHGfA)=#YArW|HxyL&B9I z_I+TqDD`%dOf2t3$8R#N9*cICcqLMORt6{**3K^y4LT@X>X? z2sCP(MVQ${+9es z6XCgvBRk(y;*hA#FvKK8ry2=1*qC(9hvJm|v1p1orLr1hdd;hL)4e7DinfRR2Pkg} zG^eo0nBP{Uw`9Qx%-Z~Lt#-BH9{7Z;W?c!U-gk>v?Cx(e%>WY?ugJm>iiV@er@F-k zij0xCYlDqp}H{?d+r(YT+KpLm1 zTuh!+%2-==V3C4|ZFX@|*PN=p_ehW8f;|S%p{1@c1O)hbV!Ke{!w#BXl4* zrls8NE+wh0{e*T#R!m&UY8#E_{#YbK-Z$3LObh}{E}s#>ty63RFEv0M3F_ z)6{ILQ{oh*JmcXdpSa5}+VAQpDkePHZWR!ni7WoQ)%gSNr&l7War9&7=;I=!VrN6? z&A}ps_A6Nd*OyZK0-r)&D&`a~)F1znPV-5e>YQ4*B&%jn1;!n%8EZx984{0s;=oz1 zvJQshN~d(y1QBFrfjz`|-{=?O^{4?z8MUt@I>R@XKJAMV5At0GGC$>&7ikujI^!whta zo3nsM)Rlfz$OoCV7mPGA(%0TMfQ`lixfmONvF%2*AKvyQk1`hO|1MFORFNebd@G{wpJ^;^si>*>MY2;0EGYqg`S!9LHtak&#Kd4` z%H+V~SXL4mOGsB+&~N;?bkD$so>fRnIpv939kj1OH~Fnj>H};2)TU&YD`q)dQ3u)+wb}&bm!g6IJqpw+?t0jUbQ*7vnxL{Gvc*_M9-kdz6$w4 zrrmUN-a2E3A2Z1aJ+7~cQ-+K~1@|>8X>DEH(o$Zy{BRQUV#)M4CF+m!Hw`p5=^H5a zePMqkwjyHOd^Z{F8O~x_nanUpD-z1qm@^fJ8giRt+sI+ac*DYtPU*Ga%MOr zx;Cxdz9#0BndPj6{MhJ=3Wf`QcmNBv9rB{heiizxt9Z|oZoa2dmSQHaFzKtFA_18$ zc>7|4-t?lJgpeaVWtgNkf2wl*o=w8Kcp!mG#6Trqp4~Yn#=`avav^3I#}J9azI7=t z*kBk2G?-7wS&wtV9FY&Kc&^0tr9C1TAGnMf&y{Mzul#gWd$xTk@S|UWD}pAa+hx+v zT2rE2yhy-%RwJdMFCjp3Pw;4NDnrS{dPIS1Yb4l<8yOe+-K^w#lw$YB{SXcC*=0uv zK~wEuJy?2~MwAmhoqk`x;qx3%k5w^wV^RZ7T!7RjLH|1QaL8zg87Pzw68w8E-t-O>gWhezJ1Oqh6I zgLge1GJ(m3Ps)9~>;D@&*){oz$HIc&g=D5>CXZ(=+ncZKbs;`w|WX2w_UU7H=~TC15l{iAAHT68^{ zU*zysC#CTB$LW6%t8={YO~73i;|y^Md7g}HEQ@uO8!8`QE8lt9r|^_k z3h-~1qA&7g9K6DP|Fq2G^xn&loGa0vm=*Y&bb-qGroqx{16@@MTaAo=0B^F(;5$cL zr40lkZEuaYmEIU!w(z~|2w3j|q=IC=wAIU58IH+yn&t8y66HB>_I-KQ8<73j#fWZE z6XkPl<6inRnqY6eRx9J>hwVlQ6ncGk8yLt1^js^Y40HSAiML&t;%34z_J`D8m8(ai zgg9XHVh$)?Ds0?hw!BCa4+&VJln1inML;GQmhc^eoR!cMedKgd_aQfX^I}9+V2j|dzV1#s}QR|j> zw)f8qh*W8)2ijLq+jL$>H@L;-TQ{;Dx9uw|U^`M0ofrt4dHpHk)y zvmR3!)hJjHhcWTIHGhp-dW=|o6b5#)h&~opGXBB347qOOAEJciTA-tI zn2Bg;-8On$vcK|RJtZ}ZYH*lC{8kQqz@yo{RI~iWN8oX%kuqBEWAi-ui%r%o!LuL(GJv$fM84m0yfQQq!dj z0$GY-(0GxOrq0_AjI?n1fC*&VKGu53meR&n;oBb8Z!-Y>88^{2M7xQ-Y1=&r%jh+g z{7K4y({6Lv$mg0DQ?QH+mp;8MQr#4Dcf@Ye{LUeE;k~-rOwV$8nuzb+?}j&z79kee zRDr!I_-RD}RYwJ9NgtnIFaH62cSU;-5ppXlD=~ch#rZ241`;QJLw``1w~q(0)`8ZY9fco)h9 z47kfc7Td2nv*dLTLUB`*Vjs93H>1n5Qp$wETx=S5*!@7Ik%n0{p-`CneZgkgQf^04 z<%k}7jmF#R05#@L%Em5Pt_i9A_^Wa@8-67^M_Ke!WzoT z!MS-Et-}u=iA)_?gk&Fh^qbmM^6vTHKDRu?&cNp+sVoITh&N`hV$r))lyc&5D#(ul zcR5BtV4A<8*mMvobrY)l%>jq?wzTpFNf&XeTsN`B5`>VhlwS+^O7c8jO~N)y=YbZ}MP zBZ|d{&s5eM>FF1&Fmc?^PzV}ibQgvzM2Dd6oKrR`#%D48&=Qh97a^U8utX*Yvd9*b zuRh~C9+*r%x8gBt6;5-ofv1jH<0xKaQxvBc(a%eBr`)1oJTkyEmd!sWxl(3R;L;1L z!o3og6yw?b9M-@md>%kSih5D=5E8-@Pw=B2_;8MjH8y!$_M+wi2=N-WEXwAvcEj+5 zwa6Wp!>KxDby2#|DU_>DsO*-%lBi%yS{A`bWnM$#)r&Hr&Qw%%@U@K*+Pg>H8k0iy z(r1?Sr=dPO-xh~a&Oh`D$W`5f7gn3MHkK3bd{I?J8y1FYGdeeA+?9EA!la;%ZlIkX zS60h$-KA5rGfFf2SQ@7O`EI-9I2Pdv&%xka0WKi!TS@QiwbgK*qRB1HJ??G+DQjoo z-m&*9m$F@`+etZBRclFV$?>fttsfs!MlV_({;E&T%D;}|678G+tQRR~M@F4}$KcK0u+VpUOq_o|Vb@pJ}sA3Uw%1Kjn zfP@ES5{O5^zaV%Tt%RUR%VZwfKC72N6g@&VB86>@ zuG9jo1utEeY~mh%V+(w5@oM44!_1HK#qPCm>6DLd9+-c?HMpspRl2kDvrmy9f-H(i zF!v^}#!ZMhny03sWO}SrO_F8x2ZJ6Cg3gEMskC65Vyb1B^jl5ZaOCvb2^5e2JP7yg zznM-$^|*YjNWbfkKgcZ>@WSXeHKKgAJ%m>7aku_7c-!m)F4-Hw4JZf~_;%RP#o z7+W>w^u2TWK=bu5?3;@a$(o)#dv#Di>-`5t?ujBhCH?z5hTAd5$z&w!dx_RFas@ai&hjG*=V-+9B#cqcx>rQWUYyTmL?P1?Mx_} zgm>_dV3fT!hfQ;-4h>bOTW=KE_Rx&r(QCR#fZw;|AlDY#R!mN@^TVD!93)_6KsV)hiyZD+Xryk8K z6hE0a9MoY@2_?CLkcP+~C6Pn)gfXO2SUwZ3qdRC7(DetACACWISVn-Fsb*qhjE8%2$T;`|$d%{tMclR_ch5hE@%)=&O6_yiG#4iay42iH9}rg{vK{Yl>8mH=P48mm1~ub0 z{dM49CE~c0_TnGg_2m_ss~=%sai+gjEZ%g*m^9-BqfY9}coR1vc`qqQKFDz;i$^7)kzhBqMtbR?$Zz$nS@0YXLAr`H-=Oe)jImHk0~qODgz?mZRj(aMBGqIwhOfUy!Vr z)~IDCgts_}t4#D16+lz&R^q^svA~DO|Fky&h?Ex1hSoNWB)~-8%TBKV*#q}`aZsO1#b4hB z0W;kIz#HICSxH1z0i*a#6rFBRNBa?$SyM^VUPXN$8~dR9HLKzj3)*iL@&A^&%&tAs zm5qc_#7vRvJ6IRgBKe277(yVVX}Jm@7jCqCi)VTg_aSEQiZDjcrt};|HgvD9d?}MB z2;8m>N|Bv%yuLLB6*Ov!c;Yv<-$-tb3m@>gq5&rvjVuBsB)>l7^~>K8xJyaqIuvWo zKDJ{j`pq{RqMa5dUktAd3IZ?ecM%9~In_{^Xak&4yZ?Uy1Nk;gG$9M(LjZ1er^;7MK&r^Nn{M*b%x3{=6KV6AC z4o8P^O}hmMkK`!C_Gn9p1-cw7%^;UgOCJ>z?6ee@b?^}Z1!vBdXzu$-&3WXjY7S4= zY3R2KpOVYSMD_K_TNJnUB@`e9*kc(*IXm=hXLiQFv94{U4v`2GlXqRrrTgET^gHvS zd!F4nA@uw$IQ%3hKH==m?M$UKW!0Z7 zDr`x7-#|T0Tw*JTS%&sYpML*`Z4NhfQrt@QvPIKOZN|tiC*|Dnpyo%6IU!&;P)V}5Vws*mnX0~|)7CizFA#(HelRN_pWEJ`h#2;J>c{g$tq9?@p@lhSAuPNs1 zyPM%8la!PuZVYah$>_6^MQ*vbwyQceC>Hj4Dx_a^@6vq5iu>mqk3`pp3ZLBnhz6%c z&Ab;hKoXERsN!z8l#KzKYH_PvpVzL$7~%%qj<9ENUM?O>UKB`Rg)(Wz-X=jCE3(t{ z`{-zQ2q#dR6;rc3no*)kk%TUZ5V@A|mUVDNIJuPiws;-;NC;tGZ-=|6+*q%8jj6U> z$ufZ=;g$A{?bOUzY3;-XnkzO5C1dZ|YIN7ZI^#L@r!r3EnpJ<+|7&`ozHCJ!q9n4B z8r}yL`O4N;Gi_la4O^`B{->!AA%P-3Kj6VcofNl@ zYEPgQM^N*D8lXLZ7LCV2q^KuqV|pw3NtKSB_x3%oxVwd=#gUwQH~gX_>+`p=&b@LqXyfSrXUW5FC)!Nr=LsUfJL z$dVWBDE&xkQt7@-qhDk>70hNIK>3?0=H9q1QHOK8gAn*s(`^I7$%}hkcx>-5zEzsT zw8V9KA7a;j5U0~~oC;uISb0Rx+hLB8nS>sh5O@)&-i|@_%S_E*qjCxA>moQTkv@YE zfS4>$Br&QI;ubD_7R&OSSkVI}1(Qlfvy~r<4bfJv+=pfCjPww1TF2ny(8yorDfbD@ zZYYdi7(=3?WUejs)?x9KZDq=VfY^Qo=G_X~2HMzX>SDy1_9d;`u=!M7fvU558IqbP z>5vuBCTC=yf}XOcxU})AfYv@*ty_I+6s0dMU!zVq?Lit3;wDkfkOEk zJK(vobDn=#a5@Z_ALoN6Gj^GpUY4UOSnIPQH{(t%)A3}O z1r13=mouGP)D^yih+(aNBGv!IXtpNTm^}f1IfF7TsAj2okj#DE%`Zoe1zcrCtn#j? z+&07ZTk|&9`xRGuo8+sNf z;q+ctGBodiG64{3eK!t%ga7G1O#1+yy5wYMwWA>~spfTxWLs;ytspi=wbw6LaTkh5 z*u?C`$z0W`*U<=(l-;eS>40D5OG-qQ-|6)aB@0-}7o9*C^9tU62}y#f*JDyF%l~4a zBY`M@;{e;3LdVdKpcTR=K#J!Y=OpQ~^Nqn42FPI0M2nTBvy=P?n%EFU%KOQ#x#_aatW4SB6UkAD^ zuF?jmDyx;0%5>G{8-9OiDqVYDqOa=y@b)9zTVZ1Z-FAOY?gtJ9N$+Q*dOA)YhuUp< z-I{tVZ*Wb6)AaW)UXjZ}9aoa`Ac@Dd_{924uYA%s<$DF*IufKJZ{pgd7w}8)QMvKN(+oZf_&NrmiO^W>*RyUicPv0GW&Q34()>8cD zE@k%Zi-CNX^<(*FZuo@VWU2%A4Uafdg1gK@R`WCVAek#$AFgc%zxeWOB9~saS-%{`)*F+P5^RJ$oaC_a7`(HdbRcHea)XaWY zdowQAZ86k;JLbNyWxm@jqx<%Up33kVm%V7fmHfoMpDhkW-8PL$IeqmYdwGR4aTVp@ z7VSie+Qh4bOI2<}(41-q3tUF0ff0Ah6erP z2mqgAjC>o&zS>@G`}r?*!pPYQW^V&SC4=1moIZ0 zns0g+tq>v`crCj}pYp9MP;bl7-~sfv8*L)LKK3}N1SC0xiQDp8UYpcn9S(T)ZG$?a4*WVJs0R3*NDSz_Y*%XnshJgxb`NbMg z#k5co!RzsU$mwNMEYRxxGDPG`&5}1hX!fOa0fkgUNtonvWrkV1*78?@+ld_u6zVt< zNtO{E)n0!qYo~1fj40b(E#Od_nea|q^!!yB^(oQcYEC{Q$bQgYncngZaboWGFf8gH z@RYNwG-0MOlkwo|&3+`@;oK?O8Ni!{T!-1x95%h!#>{Mr;IwugxiuPvE=5-CyiTAb zIGS!|xLe;J&vkKY>Nl4|*CWl{LRg^ho8_=GtR$9t(0M@3q(tM76_Vlpi#$bXvBW1o zfBWhHD^kWJeTt&Dyj5YPqh?HgcXYxSX$76D@bC#>gyLxz-mCyY;K8{9EVX@%MF(Jc z1I?ESj%1VXx*+(S=LNi05JY;I+;6OfsHzf?>LmTF19-)EXYmjV&&l-^2>_2z@c}I8 z8XF&?ChZ6rSC|D#LK`fZ7~ss~$x!iiqt2}0BM2+QdO^r4&LErCABqAfSDNL!+=;3OnT17f7c(4bN zXoE6l9nA>|c}Z=1i%1vZ^BbG}v~eWfk)wRTuI0RAf&J_!rJ4x|3YKXaSojD0g50N5 zFv|v28D&?l8)EdyRHB`C{}4rL9~pz`43j4!UX;RQ9g{K6zdL}PZ8|fLu4EuPYw9fp zdysn}HP-^wiw2&4OdYkYe%#J@HiCWTb5v~)5nBI?tZL;CQR)lV=pm0Jl{5V?9$c&d zH;crZssPYoXZ1R74JB>#jKj2D&F2aw#<<|ia1KIPe~IcY9v!`l%i8RMsrg?G9201h zH} z)=5h)AY;wG3jJifIIEJly$pfUgtx_fu%Gp1F7n3=*zB(3|Fip>6=3fdr-0m z)q=LPSsMP;P0guahH#mAwBPRk#7LM{n-_T}J;! zTsi0eZabr$4Por82jmPqM{q!Nm128~Ia&P3OF?LAjEVj$r-}nU?Oc!7iTN^iXJ6fwOMe+1pyq8ZRzZQB*&!ph4ZR ztD~>k+r!@Z5Q5_O#oj;Gf<&bM0z_a4Y~b)j6M{XUU&-$P{5Rw;e?iGLmq1dUjD5?7 z34I8^tqAeT_-OA4dFOB7R*M6K=J);q)4*5CDbs3DUM5xg{uzhz{`M062W(^#Y1*Dy z>g|Ck_*Jy<1kAe^EWeTuZ%@){I*qr13a)Q5(2mNo8+KHv8MCsao=a_9u|F$48if2B zu8wLIlJ>mQtKkh0*4m$q?qk0@rf4LAc5I@pt3?xNRs*%Mg{;6egn$7>ZXi~6F3Ro{ zrH0KFN}yDo=IL3OtxR>lcSV=xzV&1XoAIjXmrpFqb0XVe%OGnDA}suyZ+6|8-Z`l?rS?M*IvZDYuIjpA62BD?6_dh@pAuY>zB$5&oF z=!|AKwuFoJIJ+>7Uw`#py8c~z^sDYdKDgMZPfq5YQl?&+9+tNQ`nV5KE!z~pH*^&VD!==ce_ zHVjBfSG98WJMSom+<1PsxQrZD?Ok^H=54CJenj1DR+ok*9)qnJb+2yYHTkZ-gUF5F{Ps0F*Q7U6c>lw6_2odQ zjz8lk0ZYa4AFASZlrA4oq6Tv&Bg-47O>|rz4UTvAA`DX$YgC0|8e*%}x6071v2=-T z7}hdnPm&1%?36IbvNitmx+#Z{vrQp#vHZ7Z zM^8H7D>0_PvEppOqVLttgZ+K9=+u!_< zdz&}b_s6$8R`(uB1?^MEr3p`2<=Zk{;lUBf^t57dohQAPgdck+6e zdr2?~zbB4FxG^8r=B>$xJ#(h8ChS4K2cz!^oss{OoyvobOmv zF+Kke)H7B-@rzVV=~j0$XQvD=6HPPG+GmBq&XU}mdICrRCAN2%*Y91apPP$2vIYG| zB3NY0VcpvbQD{w_S_vvL^?yKy(;QTm4d-uScr#a$jT|M|e1TwuDfX3(1EyJ0t8c0x zKQgb}0Y02Ck3;as4^vu+(lMtn6CDa!aZ~&!M+iTj)dG@w?2;W&3`|T0Z*~EeF4&0# zK*@=|{SQ${4jnx84^T$Y`K!L4#R3)89uvZ);>UHg*%@pB<+IqAckZRf|iFoPEpbxot@n}kiOO@iCT5E`3aHuO#qLM#QDu)eOR07QB^P@ zw+xMZdSlwCF_DT|(jF|;XRczDcr&igi(-!kA@+*Kb`R@pTp+@7IYhrwmhbHf?&s>X zng1?`+*axKI{75x?>u*A0VUUeud(bYrb7yLJ|k+`eMHWTw!lRHJ6hxYHZMj|_^G&eUGcpNF3(7h|$}!H#Gd%=9+P7*f6&kBzpT zh`ARNza%}k2Y>uN*Zg;WCTN3v|tea0J|U@KyVon5T^{rS){3tHuW zh<7AQf~5V;1(3p1LiopJ5WeCi35AZJ0rMt{V-QWqE)w`$WEiQ@Gx!ZGtObXyCguDD zL;LZ}j$szk8$E9!`HoFU3Qqs_q_$0SP_RXms4Y(kw4+GR&tv-bmM;Y?-b%I~^Tv$F zoXb(EUu=@?U6_igYfo5M~^I29?2#&`2;n4%3!{%rfm-&L_u4e4&IcD_C zm;KKZdksd5*ffq-zM%fpVc5DFNuTeMv?$Rs6J&yaK7ptXTaaT@0G1RlC27~^$y@_J z!clbeKi~%i2Us>z#Y!!TA)D;J!>7A~Jry5h!4WZo(_qu%fRViYUWEaZZf$NdZSwK= zfP1rj4(&uU-(T_u+Z^?Hlkeu2$=7PDQx&JCIH#Sw{5okVtsvAUrC=dg$TO=yyC{RnEjgoA|6$i8_H5<&GXsefw~xy!5YcT%3i%w3?4SI0V* zdi*e3yq-bLK@y^*(f>h{b3@5$92yb;h3L#K#Kg8 z75u!6yQPbq4F5j3@MD@P&F{W7+0y4Tw!DDKoeJf!j_~c!itqn<#f^4?Z7CK()-uvb zgk$b=1txcfY+q07ShSGWt(Fh3Bx`;wNy{{t((8rhV;m+S89m(0S<$D%@;-j09NDec zw=V~SOdI}YzB#hHZZ5rcZ%V0R!cf$@ExvxW>7rEM_a2?!vy%1U-YBzo)R^by4c8ci zx6=vwkI1%Z=h!7gx~5%AURhaq6!Vbzzt;WlFn*<%Ej@2Fl<@B7dd!u>$tl{#Bc*$h z|A0SQzYaO%BC73#MvPqHs3Tnu-$L-!J7;tZo0d1$OL_YlD)ek){(&22;RyADzwYaV zXL1kzo8MY9Ac?!9-RF&MSedca zz~isW<8NZjrO5P)rcFfj(0Uo4i)lnxAZm{0CShIO#bm;!N)tJhG4~;u!0H;VMoIT~ z+Kj;|(H41BG{PA)UzQ`B_Tai)>jhXgCyaY^UNExp%_=31jIg?aFEdF$DCh}4qzLF) zDvP!ZH6QAWJu&ZHbCmv-M|~7$u@*V97ASgN;LfAcPboCT{xhXyNLZv%X%z25IS5P1 zw8jpATvYO;!7qg#oM{>dY{_OV^3N`+i)-eo7~HbV;%z@^e3#vEu{JI9z>ou`Dz6pk z%9R>pQ-x#Z&e_IeXIRzQQM*2tiZq|7PAZJ9R4-81<%KzO8ucQ6JDl6YehF3c=wW5H&Y)OxT37exlM)t7gmH3rG zAXxbI3dmmZSCFX!M7O$vH$(vmOm|ESU|-{ydv6Y)h6kG(-qwNCHu293R{<`Z8}f^L zSlSIe@^Gc+ovkRE9*UH&yW9+MRZwGi2vWU5?s^C4>lJWnZ7Q=A{^E8%fz_4O7{4`E zw&+TgWAg&(Ho7|Px1dx0hYCKJX0b8j7DDf^c21lJiQytPE}ZmFUXs0;xCi=X+6uKm z#P({FERPRcG`zxqK^P{i@rH1DNQQQELs}Tu1k~pUyNMse6M}eGNCtaapn4)ceX5ME=^GkX#?{Evn_Bezg0U!)f zlL28ND6QBrP5viGEQ}170&c=2b*_MAfG?wIr!0!!)gwZYf{8$iTLaD_Zk z%y4@)#u?B-rY^!ZwWMq#-89x$ReB&D8~r^AUA915dyTf@ zFNmhA|HLD!FF_tuK7wQLbCvmP@YA9Z@%v1>kr2F9#innAg-zJPwK~R)%xRmzNE-|a zrp&5A`EnSRmn==&C*NfLsZal`_|u>{e+o4WkA%FD6f}{NPjl{qi871jZlro@cR{yi z8v9xkmh7M1Eb%f{ixynBuzhpqa|~>7pZ}}MnZ-rdjJV#0QQ+q-=E0a`Uad3PEVKEd z88&A#PTf#rpD*YLD*B9PL`B=D#V{rP^``B6QJ`pHuqF)7QE*Z7q2GO=2f#cobhG*{ z)WZ8gro*IBOfrqM{1IX}CZBjW`L&0(^o(iD3my0%b$(h|e%0(w6g1Qq+YfOGEHuGu z9?oa5-R6UgTV2QJQ_RR>OO6OeIoddKXI94I;g!bM65p|@WCoJsjMX}`#v6~r89C@h z#W)l|jtgyfyy04V0Jjp+@+~WpPCQwtd8|Sc4M?SUUr|hJ+Hmm12SX-K8(qC zE*z;Q6tMvl;8u#|#C#E`u0Oy&44@)gbr+0;h`&cEo)Q)Q6asGBU|y2KKt7i@8_0)G zET}Ayw_7giP-qns;m8P@3j`SiAGq=lXa=;<;(#&dmtY4_SnpDQ*lF|+Fe5@^PoIkR zgduLcr4$X2qsU7Ds%~u#gbZCE5Z)e};_(q_DIs}k$*gAW_iJ6Ww(Y=A(H|< z(l1222XQSy&HCiWYnc|K-;LQAWlvKf%I4+fDL3CzlWYC1{VGYLx9PBl4g2X)42ib5 zKyXU_@~xtb34O4o?IuM(p{w*_adGumj5g0>E77FUHQ*O__|@x8wNGxR#<)CH75(1( zFmEdt$W~qdWYA$a_VA)n_`EvFr0DCwglBWz@_H=Ba2Mmr(HGgoXlmkN1C>)uS=mPa zA)+EPMP7l66t&R9BJjNXz!!QV0ZIf{c2#*VUIu?O1BZUQ>_Dz1tT7z&A7a$%vmjMy zdSTM{pqC#cCo+65q|A#*EOgn$C*_^_O%MA+dpX(Ki~7EYT7+edo`z1x8=CD5fj0-? z-@97ZKf32kUp~R=T1|0WpA5KgyG$f9wzKNtaN$$h`XUtL5nGmvW6( zmk~+ID0}_!qf7y(7H?8a`l$!J+-BW#i7e6avHW-goQ@(2&TZX3dR%pS>bQN(kQB}?s?0l!=1pDw^W>$vLj(P#Gd zOKeEo=b>)zOqa)F=rzwHEU8D3?e3D{hK<;VymLInFz`reb6snLjpQ&eO3%BF{oJ!p zR;hOH^pTCLWmaTGDG8RGmmy+;scD$otX`0svv&_?WEs<;Fa7?r+=5T`@>!f)!pmUz zip@B18*o(R@pI#=(xElSwAndFl?iSs2M5w%r;8q1G;U^zhMaBMbN zI=3e<{l0M=^7o)`89)k!*l8vr$WDZVGl>FpLyG&1(DzkB*vmsKdFK0H5yfP8$ENmC z{c5*yz@s^9^J*h-A=b|KX?#riH#XY+7~o{xrB_`eTkLO6eu17eJADh868>mTBQ3gL zcZQO2mh*KSiBxIAs_W@@8uT@tt^>PH$NE_;*-dNWj%4LSzvEqvu`DWI+17Pv|HRtZ za;{HSFJ}n#o(V$VyPDRhtXU)7GgPSCuw!W$ZH`e3aAQ@dNnU<{t&ay7f`zQ8hYiHQ zJ0Cf@p(_+%a+Mp0N_PjCun7Y4ET{r-MNJQ8^jLW$8R~=IKX_x9OeK5#-Q0&k7^43k zcSBB_(eWBu!sSV{BI2F!U$jG|dHRQM308Xe_qJebFvmk>ZsLT%1VZC4W56S}dmO0fEPP8AB1?Jk0UO(7PZ<)u&6Z*JD|HOT*0 zVDMjmX6E<=J<254fon90=X^)ZepS$xQe9K%$pS)g-7K2@$u<0dHrFF1HVaRYB2qHX z;+j?MKcKXJ(OqCvU%$Zf%5jJV$|zdm7i9MREN{^K2}=5M5;1G1#t5-#t>kdtIVHk_ z0{q%7K0}%R0d&sZ_mWx~A+_>j`E;Elq)13)(wIwRfx@07WA)>-98og^|cGn@sxLCtyHZ@lFITL#Lb^uVpr7Kb_jM_1D{ zTVWLY3mo%=j{QRpTT$!x%CPOMeuNoUHOVWp{MDA)?MAP8ufhN0Uw!sQGj}88`Lj9W zE2Sa2HriA1`tpj3)pQ`dX-$z6rBq|G46L^GKsnx082J!Ia`Lia;%&@8HU|~ihf}gC zNOfapga+W5JpoD-A429gfiEQwzvX2E3Shsrle^n6U^}{h`~T#^>h3+Plf|nRWg?Wd z)g8PuUnx$E9$CCh1%(Is@ak}`aFABdvZA@>c}k=yP-`AP-j#?VQ#N>SK948>L2iW& zm)|nxC_@5yxe*+mh5~UOs|GC}$GV^)4@}=X#ZSMv$d|R2SMq#Xe96d`rBXxJfw&1( zJkd-Yhnl@8|0qmZ7-HI+4J}|RX(uYxwPeGB_rUmp7#(ZZDx|{g7liYbmf2qIHLCG< zO|ur@z&hxuC~8F&{p3KQ6LJ7<``GNb>vMhb3GlCXE+XIUJmcBl>QV8o7=JeDCpF;@ zhoFpv1mqOYtkNF0Z@e$lw@ejtFLu@SI*aja&q7>0Ls!AQ5dJ{>5p&$P%ciVkV|6%^!QGc3no zc_=r{o;!Rjh95v08R&}Mm;N1x!PQ(ArxqmIcDtk;vZl+&wQvTHSVi8Y$?{@F%t83{ z$U`kaNMK5-Jh~2nx2=Me>j|qPb)nHJpBCQj7rDCyS7Ehj;>$Px&O_ zmA*2L;U||0JpY#N=hYWpY5nc?wuyM;XhH>Q{9?U8^6K7+z1h}+S+|jVI@Cskob3k( zVbBGpV1O4&vbrbuR(Ef*=dCk$8&XfzG&I(j^R#78ql+gi0d~5-Q)RAOh0eA)`w=6$zCPk(87Wl#&KP(BJv} z0bE=cZ0CGF@B2LWZBS+!r{HPW_j{^>;8^WBv?Gg_uZ<-EYs&QnFPD$1%|Jm|{_A-l z3z}{KmMGt8Cda4IzvsI(>I%ip$4;l}UBfoy2$eEK;&u%$QdFp|oo5GBrSJCBcO}8D z$y%_mm}%sTz!Gh7(X`LuCRP3XP~unjdo0wOM3>7n!YAdMmJnwZonngudnBIYWl7ZYC=ZY;{@H zvWFWWf^p`KXT_0FzAl9=?;xL}t?KEMY6mhmM@8}9hRn2`G@k#3!@Xb8^Jn@Ol;j+A zn|spz7jw7gth^_B6{KoQjgVV+PovEVGF)Q2c*c+x&}P0ss@R6dV>H;kWwx8|GGmYy zN-@(T@Eg+^jI9qRk-nu;Wj?PL3-%-#Zb)=rt?ZohfaOSx^dc@i(~ zb;qkBg{0cd_)>s^_Dk>0lIIuD0@plHrIi~CFh7WqgP^=C4%cW+N-3{=I%*^_5IGJI z*23E5paB=*s*>l^ssW8KZTB|KP7zXXJ0F&L>n^;rwqvWIcJ7)JA?lQ2i(J`e!01@1 z^6(a!MVEh;ebLY{7?DG&0VDGC zO6B3zV)%{pNx?zNLZaz(Xx$Y-9MTAG&q_lUz}def_GRcCI7%hfpF`@x0mpJ z0BY++viJ~e!&H3`eNTogK{T_#MZqlX@=5DAV&$*ycEMUAA0Q@6z*9Kn8exm#lQTerf- zs;_^grsHxjIx%3p>(DBlDY>Gj<*lhDI<>#Ba=zGM+y6aO=M$&VwI_Ff`_CcUENo2b z^)v{oBrzZUyNXJW?Q6|cn65evxRG-d7-c->!tf91-P;dr|M}5vsq^*c_0Xp4CvgXh zE9XwNi;o09T#B4XyvA)MZ1>)M$n>l2x^>IPGEtW3UmM&WYG@(1-Q}M?`{mKfDmsn1 zwIBZI$T|C35mjp77**yq=9^-fcl$CP3;rE;_2o+Ir@h}+io??JIA=@`zU7!TJ1IYD z;;igJS?c}K+!53K5KlpF{B}pIyIWxWV^HhX7|2!9NAKOQgi-vQt2`IE<_afWD6dQ> z##_R?r=qMMG^)t7{@r7Svhnm`oSKI$GE99q~9P_6G40)76Va(EQPgO zeHhdJ&5PnKga_(GaDuy`e{4o5o1yQi%jOqSXcye+N~PIhll0Mgi*96!Oz7%oYz3&YYo0;Y=c73h499!hL3 zq$iF@r8C;8TowvEdO_Ii!8LyAd&+V^khA_e+`j&)k-Wa#OQ_$Sg{;dB3@w&<1!Yo4 z>|{&XF*+G|AObxIjM^?LYLKPK69f@KW=p{sM5XogBQEU(Ix|oC@nu~&*PLG~!9&DD z(>@2Dv$S|oz+OI7QUZSN2+bg^Y+Ng)0LaZ)DI$F#HzwKrYUFL&(lSELGVJ!6@@c7c z_s!qtt4c)c5IY!)YNQZz1D2j9eo^UB0pF|`<5p-}6sq9zOED}^xh$1vhSQsxtaww$ zSn9lbY?$x_tKhs0xZ>WsOottSmkS<0fR!l7#(SKzh=&x!8FFcE`5sV6jpG{y#k{E4 z_r00Yhr}{o>5>OenwZ4mAETlD`c^4s&vReAsy-R`QD+K~KlRzw(LzkTEP?rRq@Xd&x;`AoGqK}olwyA}c%=l5a6tWWu z4Af{H&?Dy1K9ba~Hk?RT(EqwF^aefkUbzWZz*tIBI;@j;0JK3LrhwbK&w9S4z!kqC zt{pjm4nH6q$*2;ICm_uGh$(dI{E!gKhPwpH_#=mcpu_02duRECIqXW$#9Z~0zDZR{ zdNJ`@x(PGh=)kLlxO;johdE6~VL{LpEae(=QF{B9BTVt=celnYyQwK|u#9(|8v*@> zs;w9J@T&LL3O&!gbdZH-tdzHXDf<}`yQW8R#euu#a7p=GCaDh5kLkYdPI?n8Mc))i z<)!|-=yefc>dYAl+nATVa6n0m{7la6{bpxYhFss+r5-G&XWbSz^%j(A!5iWA4W+WV zwtEVWBv~_(>kn$SiPj^6E{u(Dt2wa4TE=(`x75U8#&h0r5lv)vI<1ouXM5sw@EDxx zZX{dEgS&28Ot>M(MD;|B1yU8uo%oaADNSgaL`kT8Kbzr>5$M`f2g<%0dveJu zEtD6?IF#Xm;73__+^)akRrl+J#<0z@$+bO^#Eqea~lILp7bkQ9X$UeMQp8gBfN6?djZy7+&QLJb6vVQd8 zD#-E2-p2hec~1fZi^Oye^Ovh!5}>jC?~tD2IoGN;GAacm<*3w@g`#a${kJ2q?N(;y zgZ&@i<3fW?)e_jCs?2!?6~%N>AR+tDBKU4$+LHW>N<&Zq>)5j@AUO~ZIZaX}T-?!# zlJp9%>sh=ym-u{L7j}iA!Jqz@=G`jxzu~}6(Bw`axe1W8@$pq7r-&PPz*DOE4>(r7 zI(|_Z{|`W3Z;J1UIrFnrbA8>(we*Wa;pp`Whp!%apFnh93B%m9q{PW{r}yJ4UIQL&n?N$6^&Q__{+%v*imsaq;ko znI7&&Xeuw&2H^JCEJq#h5cPt0*s$0)g(yTPSvyNpnjY;aLzxOMx}#ClOx)zQcCG`z zuEh@7nEmkF3#7h^sV=PxjW2bH>BR?*ko#-IUuwl<5X_|625UaLy$<^a_?4udb>A5l ze6xvM?U?#@tF6>p_HH7FrJCp(P5cYoSgf(jlnBl6gJ@FxfQ!mjU=A zSA8=z@b4ZazK~Sr7JNFWbQze@Fl*~LEno@waZF(0@-I1F23FQ=WV=yiRHeDMK>SsS zf~h*{T;{OQ7Zh9CgKb-DAYxMc&7%UeY7<}hff-6E8=_<5q~*r?nWLF5kc7zK&ZfeL z1g|s5h>S)We0368%v|d(V>lvcI<#c#8`6I*uZ>{jrKIv9cc%Q5R>tzDGfW7W#MiU& z$8~ghxg5|lCg%3Z%ywn&(ge`cn&pn(Hd@7h8q!n;kdq&zf4zbrflMH5!O}%3vGc?l zoEo5K7P4^=Yqa3U#_qDy)4him^^THph(B>e%KZqYK1U4sUGM6+NrEva%z zI@1QZIs(tZwihoc=E?^nAL<4?DV+$(E=1Cx#ibFhiYJ6X{6aE6BJTx63H@mZR{sMe zb^-D41-xO6gsY!=>c^uF30DVudK$k!x(O&SXA&yD?(?uxVEFG~DxPTc`H#V_Bt>`5 zPQHK3vkMy9$Sw~WcP?mqU1>eXQ1@v_sCT7o zHjPrhB&0&XfHQWCq3U*R^~d%#1LI~Jk($hL_mFP?>a<&N0*sSuwzHB2=mDK|YSQ~A zhDw4oxtz-ik;xbi%k1H%F71`p+7 z!<20EG7}=YB&L|0c#iN~-@6}z*8Y@Yyyp1^$sr(t-2ZGzXY{C2is^k(9+u%Mm?7}& zX7M_A=>8fAGyiJv{LRV69?uv|kjG)r|MuF5Y8~UGwsYz)fpRtD9GF*QU=R4l{s=>r za_sm@qgpLnm)sw6hj#(hrlp8SFG*c=8p7go7Iz?7}WLUZS_lGzo_0LY#JSU zMw_69R!0Eyl=OZrk)Y1EouoGB1A`tNwNY;efjWW#t+R5rQ?!pE%N@{Zs8+bu&Gchf zEr@gabX34-370wxkGVJ|^aocsyNM6NZ;BM}bKzBxx-{L%q6yXo<)rwti*T|9vQrTl zq?Y)0V~G_sqaaZo(j}?*P7hUgDaeSn(<7k3LxW=iJ(<5<9d)#`?DTmzRlr+i4AtXt zkMVq6GDDG&!vg}z&zgG&1ovN6S5*4PgkWLTC9BA-Pt$@xR!;aFP-t_T1AOlO^)lPK6QB57om&TdT^!Kl5DUAV) z#FwhZYW`0)GBE|9Kq)OYV{>4q^@jwl02t(McMpBY@G%>iPCIb8HgBw&8*< z*S{$}{z^jmv3j|8VFNr6E>-&n%w#l2Za4k|4w5-6FJyPuy8FJUz@CwUVE<#^z)J|@bO6vHi~EnREkfD!c%&$l$k#+i<;jqzE=dY4R>&KZdV;6X zIfM~k3p0iFVQNwxyolaua;wq{>RaZIWRmUv6yVM=4t(gq-mWQl$@T+oo}DY~U+f%= z#wGT=^AjYw4@F7k4yo(^gcFbQv$Se{K`A?0KNsnS857H%$Mc4;fI8ZQqI}-rqb3drVEV{ zSW%2tzH?DJm$^eI`W(YRyHl1*D)>5+HE?{f8 zTQ@?XG;KFn*5SVwc6s!a2n|cq=lz4szj3`I;AIhZ&W%t1LFVUOu3JD#p}r;_X@DQm zk=O#(mLHcSq{4H)dbs9?<0OLhq3np?6WswKBmk2>Nj&5U;(xv6sigBa z>&@Gjq-{=&q+*%}gw7d&eHV8Gbs#JX2r{$jRq$vCM-^&gFGAk@@DVRPSu{OO1utU- z4hf`I;CZ?1Jsz5ajee&*IWR4M5eiU;14<9hV-E=$#0C$6|BH2@N4@pvuQLqIvw$@~ zsl^COQy~G!&FqHxz$?wW)Ea@D&AUB4z}4Javj7*1bD;%n)qbju;Z2H@Mx`&v)ZaMF z=XTYCj+J6F?T0H9_O%u?&YN;nmK-(2R-Z$J)zTfaNU?^;Pov%XWfm`ZnP=yR1f?5S zvf5=ATcEf21ItQ6mGJ$=C3eOa2r5@JZEo7<9aihIyp#&v!zn;oGTrIAOii_@+}M{w zx#^Fyu;PzSZRKZp-dgv?F9M5kwA?=QcjFauXd<({X9wElyT|WVPWQk%lY~>M3{wlm z#61Pq$6nn{@cZ@K91fJ}9XGHHJR4Y3B9^?jhK^dFD&EG6Q zKA-PC;TpCFW|n!Ay0?}ILKtPne7t{~>e+=nJp-xP2hO1dHo8M^j9GAV`Te%Auajz* zy{-sf4?j*hHvJKhz-R-zS*M=0^o-pAeWcIR9=^i9R*%~Rv^RH>x_UCxxc}Gfb{Vo zn0)I;TpcBevkVmT+vtLx?S%y`3M5GyG;i?)=4t23U?>Y`9=%-63s|5!`{0N*i>;SH zNt-d%+$9!x`A03{4Yd2HoILvnoELX%x1Sd@y%1o4u!Cc9H}TkC|9}M#C>dF}RaGgr zi@)IIn?F8|b6v2o>9)8pd=X5=7xGC3+OcWmylo)%nAzat_;VsN2xCcQx-3m%5X!T1 zqZayP^yqS#_F;?&*@&qG#(j7SOiRBlF__dQPNk1T&~3z{9SS^D*kSa4F2nMC=&uG* z%=#|zk|fs~H>&c<5u{L!yS0&!nw185vT#iM92`yTvY<^MOUcQ16?afoJvyK`DvWtn z3)vBVBV((=*iR1*e`nD~*0JLA&~wyix*YY}jl;d3?Fp{BID-6(SzP3J?H#e6>VFLHTJzeynE`I2q_WKVs7fdM@IUT>}BllBfcR;=A+Ez0AxlQ?yl@Bx@{3#esMGFfNlJ z6O(m;4#nvIIpp(tk}hZcq&J1^3ZJ~1`AJRlEXgN?cCkR%=w+%WhYUUUec`>hs{n z7j(-@61YCUDwoUIp`CU~o?Jt{GD0JD&*0!z(#5ApF$W3$-s}8tHr7BTJ-F1LzdO7_ zy3kTTu+9H`1C%0__f`+>78F!R@X7OoKNVu2g$4h2D&feN@IT!Q7=>;`po}bgH-m0@ z;l}_WFxs#IQJT+6qQIPc<14Ar-RN2haz%o$CFp;%bZcslUQJ^~>%Ji`TA|*~Q0GC# zZ);elX!R*Gi$22CU}}#gzDh7_TG1C@n#*)RAQj_qxUwKeS$ZSrCW(MRebHFUMD-|o zVH9J8eJ#mhh+tzYzmTJ+PAwMvkd|c;fc|Z~;y}UwvU$u*ON8(vO8J`zCH`s)B@y?D z<#2)ENWvmEJIcZPo1@!k*8KU?*oif1I%SNm(Q+vw%ZK;yuXU zmIAauej8@HS8IUC7tKXUY7t!V-&$axT))jn5|(A6xmIfl>Xu-VG7Y#q>Y(YJ;hiC?_J%h>&QtziZFEa9CCMqeVh7RjDNPQ<)B;<}#@WsI;$K7IBO zNWAX(T2X4uG?$J~Q0UFMF)M|63N`l~!czB0G`gb~QB!$If<=I0~Zzn=cQusCU#~*alZJbgPD>Nd=^IU07TvI$4^Q_&? zBHuQ-$o6a&=BnZ)Nux^K28PY`t?l{kJtasKJ&HHgCc&51fj^w=v$FZ5{rXcyEF*Y> z^#1D7d2YwCNkp6|Ba*bsov3h=)=3RH)749|3u5QpMdeQB7jE9+q`2EOs&&=N3wx9; zBOr6FOotisRDO^2V+Y17>p}Cp)-SFRr7?=bPP6w*cWVE3{iJN*^XJo&^A34bUJMsB zoa|pO_*FX81v19Gsl^uN_I9cmswObrpPwy!t&w6Y{2LmlAd)G91cutQkO}#q^@Sc` zK8<@I!8q`B*kcF&H-XF*6AQHphyf~%l%+xwGhpwEBLsw1bD5WRu+GuI5~IG@($L)hEF?MJ2!{eK z!I&HJTR?;#ItR|ws+2*_>#VzcTEN}^jTU-Tv9N&nLxS!nQ*|#%>X(xiBA}KZHx`Dj zHxc?a2Jv0YmdG!fzU3AGLChf=`-D6C=;QYQ+3no_s^CJIy0!FBpRTx6sD;EFc4Ks; z<@D{C13xaZVysz~dD;Xd8OnRdK2}bQCw0@MD47qwRbN%|;q9+v;|&lNv-qag84y7h z?h7>&o*+@CJK5Cl+-0Up3LY(8OTXD({H&;OsARpHktUohr{2`$wA`D5hOE2DFB)2_ zGgj_>8eb&jHvCQQeMyp8o{@bZNhvc_OCXT8#@4jaO~FcLV`O|dxPl?o?+dfroTT9- zFE9fqoqBbIbm!_Xjcnz`Bu|K*q%4+jeNL*S5DahX?pN~!N+ft=Fb6UzABuks1-EP6 z_NVvT24<#8oa@&$wK|`nG_=c1mPbTiW@)%JU;hU<#r5IAsL#{=`Tu})wo}WK*~ht1 zi&u4EN#T158m*?VH5Mm0!PhfoT`*z(g6z5?Tl5VRq+Qr!H4UC-?j`nry9GIVbmT*{7$BOnD zw~l6|KAV}~Lz#>{jar9x z=Tq5E@)?Ls8H#A(946$BYjPn%AD48v+oUrn@pwL#t!!v***@{<{_C9mn6`Qlp_J3p z?elVJDe&TTdg|EL4W5(U%kAwy!S$oh?WkWaa*y(5p&%%sY@VGh0t^VF_`sV|5OGOe6xtQ0zzE%6?Yv z4>lq1UH7%3Q4G?7EF5J6Arv@dz43C&qa`j%F#Wctc5%WJJHX~|8KnVLCGJFZ|6oy) zv6O$^d~@6ZITCGuLU=HS8=U9b%%bt^foaKT&=0^a-cC4(3R0R*Ef{`Y15xhMqVuH> z-bgYF(x=|#xG7Yl5QHwEq-XaR>L`WGoWmwo1Pw)RI=U^;S_>nn;?@C{y|V!IS*dh~ za2|Ftgba}hk{9Gn5@9|hbPM!!e#xuFu$t%KZsR^dk82s|*?~w1jB?N&IxUD18qTdn zdlbVt6euRTWp9);LXKEZi8TPZn^>+^3th9br6Or=0VRa_@dN^M(8tv?Yry38>F;hS z6tfOp-z>yERb*ekGzV}MRng|1DmMW+v)pcS>kte)q+;_vGMECFDsJog$w#-C)a3xB zOK)i6m#+kEU~|N_GknbZ5Io@|{#0(PF;qZGJ9AQ=@-&Ynh11|;FVB~R!T=v`v*|5R z%dwW+H01Fsk~NFHq?;shttVrqi~=N80*D}tZRI|JZlC5J)2%FFuPGnOGIN_pPY8pW z21Zv}G}|V{n*;%SAGECcpE`!S19!F!U)D0t|Izm};&386J^)@If@7-WpUj2K-`Ks| zjz=QR?<|{Ckp(nFhxs$#$@Ca*X!I0*FtKQHsSOvpH_h#j$jo>oGdAYLWw}cV4JrwQ zp3Ga}ov&O?=5FbakYFbwi04wbd@>t9$6R5rV+(2i`$ZhBmO=Iw z4j2!mR!L3Il%a2ghLwYP2jg3@f+>^b?pJM2wY2dUq)W21loYdxcyxz-?TQ1c^$O1% zN5N&ncaK2RL3m-)PxKT}n^u|wpQ_yCWzVjtf>{J$t}PlCa87#wyo^owZY7VRRICg= zEHSGs)~x_KBqe4f;bjOMSvAGg@;r3mz~vge6AknXm|T@7YazU37f1-%0(h;o{{aF2 zfC_*t~JQ1^{`3LL} zD3fvtNN65skvp(WVYj1`iu+Fl2tc32IHB1^5W&;XwUiK%dSk0WF>D2qqyn5j19674 zdd#TBF9AGK5c68F{GEyzSTt+qokL1ksI+H=InL8PjJJgA6`^8jHUPcvqzX?R&{eIs zm%LmZ_&jM-lT&4h@kUt2=J8CkcC?8lrQgHr9bS?oHipRt{w)gRNbOMsHhvHk6dA5? zg9eGp&o5;OkN4(*)=KK$K@jOSf*u1;<(eR+qT{If5wqG$IPJ#UaQH*R{3C)Bk27dk z?hE8#7ly?~z&OKdHEWC{#fULoIGmUIdGtaPHLU2savxe)HQZ0`z>i%ladk@rrXJWA zpuS0?qI=$B2TIV2CDn{`m^3Kiq;HL~OzjmI@$7uaU*!JUU~w7o8onI$b_!-O+?|8f zXFAc&V{0U=@0XWPEbp?k&xw(zW;}eqH21!V@ZEQ&xGn0ILPRR8JpvjIu=@MIaJ9Fi zq-U)aGZiRz9=+=5$U%qw2Mh@ujlssnWb0EFuSxgOR*=014W<7whUfoQ5Eigc=_rsgN~(opvG+qm z0`$m{8(VNoTlb5m*GfTGGxA>q#GoK%eO7(6Xv)<|o_xmcY z&TJ&|`ITk`DZjhhT!^ahWdGWwaqm>@Eu$*;GYRp(Jdyez1-n|x>*WHP4D_~!-^W&W zcs4PVJ=%&|zO3+I$n6&vobN>)q+Bu6LSH}CeO(+>x0uXeAtC6=)SO4R!PCMT)?>w_ z+89YeBQGg!Uh?$$`)k>earfNreYf!rz2nb8s&Y;?`UO2yvhzvxdUs1Yj_G+e2bomL z_X6xXlRvAIw5Qoxxo~@8ax9dUp{XkvoC+`zPD`r-)81>3>*EN&sk#l4;w@+R%P$JJ z*l0(yr-OPxC8CgZx$^v*d`k*q!p#-NSK6~$1f}HvQb^9GEbv(b^bb%^Z={9Gm#f?6 z_aa=?Bw(0n4Xl|ohWfp*S%U|wQ!oc3b(3{ox(6u}o3}u_#!(DPXw?+>yA%1dTkv5? z9o_D+BqiJgh@7d&lcaf^QF?=y&C0I`R503r97|+(>~`5PQX4rU9^IJhHB(bHbui5A z0X@u>^DURk66@*ChhhLV;&Bdjj#I^_p%9xHzT?jOr+^{E4LXtp+_@L!l+G|Z7@nfo z7evSh&FDwkn%rfA4S}AkFbyhi*%Ss-%^~?yLY4kPubbibUlFD+I!R2u6x#HHx)(LZ ziu1@92(dr7E{jr|)h%Yqd=w*~V4UP&qDnJ2R{VZXSlz>*?nx88j8D*q1b@%hSRr<9W?x-M?in!9XBuSh%vJ#&6 z$}201u>6843tv}d@8(=tXHbh85{!2|RChu&0Wzq)Lc-v^`@?yRf8vN>DHS^4c0%>= z;Ncm@|7(ZT!A6efbP7@b7V&%I{ZyeQlY-R_ki$#vulPlAPF_gRr1<*4gF0WNdFQ(! z@Cd#<*p%|6zVKcT)O15b$Ego3>Vu?b&;Cm!gtL54H~NfA6<%+DRKQ02xc=aB;vZ1V z5++Hh=w~3G@TYXS>xhupl^Hl``qZ=}Jm;G(>CMoRjiMC1`Z}}cf#elAH;DpLFS{JK zL6|dr)d>4yx$%otP)hwPB6e~jFLes0q6fNp)@S7mv?$pnK=}kK{Z!l$<+!0L7S_HE zNzt9k(Z>(`IbWD`DV5obz#d7CdDCl2RVm1>;wh;92sHO^?{?N?jluJ>^hbXN$+zI5 ztb>`4wsdKl{mS@|vYz-Gko-W}urATRu;9Bw*%54yi`}eKrw_wL4J)9!aG<|pp+KTO zs2Ctpif8{9Xo=wwf7tK^qAF5 zb;$<(QcN?rB|%LMvX)XyfUKZ^!3N^b3(%|R*h~T70)M;PcW+<-TU4f{Rz;#~ORo_e z&6uloj7pXxT?ta03@`UKGr3h|0q&Bxx}U2JL@wsov{X_ z5uJ5OSV_%1A2t&l-ns^PkAO*yCK~5-J>dJ>S%1DMcVElqcde*|l*AQnkql4@!h>KK z1R-G*DFjM~EGc*l9txV7SCLDLes8~SrzOD_ScZSoE~1u-HcCLt4Z5 zUbyv9-Y&8DhhV87TUNSVNYH4yjpYh6>RN>B#KuI_+|WN@mj2oa^|Q*?OdO?yO5E9h zW^+Ez9!h9m7T7yKbm5cxwa)WG*hTu!N0WkU?@Yd|jY-%K%ltmsXxP-B+BmIIxi)f3 znR;>Tj#TS=O2x?G*bj3SeTeuRtLO!}*{e0n%Ws}JIgxvo^!}_I8%{eU1TT`O7M8>;5K+B{VoWMkJ?xy`Y#xWe3nVaj0K`FhUVY@4D=wSfC(QIW1x$TE< zMJRDb1P{PWG31b*Hn|JSOHYnm)+KMYry!}AU?tU829nF^sZ~E|Bq07sz=1xlEbm}4 zOC$Um1j$m&8XV0RAq&7ge1$oa^A=o#I17vJnBSs$%)EbY#V3Bg(%x%8& zTOAOTOLI=U2QQkWqnQ%s13c)lUG*q8rhdaxL$u&}Wqq zW+2me=uWG&{6{FN$TU69g9)56g?7TT$3K9;#ql1HD#BEkRKwKEhf-sJpd$|XXL(#* zd6@!-J5hY0<&F1NLms!zk7RDBxDXnRedULv8lEG+4PRy?36Xb!Z zfGO6$Rz|y5$`hI`5l)arPysKJ@CoHZ&Y`gP*kNWjONlsV- zMX{%d$9X5516iv7_R;S!XkRgq zse^*3Ia0SLCNOfpKH;ru5@<55?zex_Tm?R;4nsRiXZ{?H_sNv14dV znkT0AXj8p;+}3^o3B)yda%j)-)X!FiWqB1K)%_a796zl_0keL-fhfs;2~TI{GTed0 zz#D<;`pk<%XR|Q!MZQuBLpS|yKh?%_mtsm!5jSHc9c3CMXu;f-X<`kSh3stjM7$&5C_gAbDa`tr=?u5``nmRB@HeB?ZA4cYbx4TICqx?)lb%Hc@^j9^p(@qO78F={qhS zbnU9~B-zocjjQ#S#O)I9mo=rF8k!|hMOfWeQ6{U_K2iI>Pd@zDqu5|RdC?_5I_oQQ zuF|XKx~Y-UV@wvcz%a7DHNQQ->Rs9)Jieu68>ewh@mQ9`!m?rf$ChULA3MPpcl{uv zF-xSrUfb4z`e(~bPg!jZcbT!o>FPkYZ&Cj1K^AXAxp(}7zc~?!`Jt^T311Z=PA9@o zEvCM_Utiv6S^l#6eZls*Y?R(|>#gDKwVMqzNy}GdR@qy(IwTr5c@#s%cDQ+-pKJP# z?c+;$o9e!7u2f{~9K61@@|Sa-?OOGboP|=3mhtXq)CY#xo~W-Zs3+ z-n%ezY>JVae@3zBIe&~$QPe&$A}x}qvGyx^)H?B5|3Tz9qYz_tRZ$5%$~xfVn8$DJ z?;o^jWLHA#yE?AfFeEMmF#E2YQ{qym>0cF`XRNSCi|n+hQD@nYo9L9 z?B)wnhjKm^*$PAi&nna;rMvmgOM?k^*JP@q+?1>LaR)QkMnwDLyp_Tw!ZPO8e|t$SAV7>qJENth!bskowG zeC?P(*v`ts%DyVvTw$g=A(TbZ*V?3OKEyNSh~UBO^KSDQg(|sbsgpE81R?z>RW0|G{lb%|wrXV08 zVMF~`UlUtS>PX2(zv}pd&Nm6HsQ(xkGeSqd>QoG)EIR`XhXSxaS#+tmo@+8bE`?+^ zis=)B2hHfThNu~#l$D?eYUifRyDr9ebF)$$)ARLo-KcERPBkzl;p#1@8~i6U>r-U> z^i5?cKlH~x`fYIVyc#$$JCAM>{9`y{)%Ilb_baMdFCrK;Y#71cai>w3jo(_GQdB6W z&1&`6kJ>Smp(~$ioofe4ML4%4quiGnWz9!}zp-Pm$658V553Mj?88Y41=RjbsMY4c z3-F?*i;EkU5b9@0V8g(9uZ`f6mix-(QjeP+j8w=uq<+;74ef{Xc_^qn^r&}f1C3Ki zMQ_$#`>!u|H-Yfn{BA~8HmvYHEamN@e*ECxRUwu{1TM}(foED5p{MZ;Q+uHwpZYr( zqoeePcBJ8%VE1@`Lw2mLR;1~BIPxq$4 zd@)HX^B7R0yA0Gnv+kA!jR(Pj4WPVBv%1XT>YI?mDmZ}lUk-en=^_16h4ly^As?Xz!gIOuw z-_N4ad0)peoq2oZ;wwE7d;4~$lETESzZ1H1| zrwyF~U@;S2ln>D_hcmS|bW0&a#(;^R3{;@|V}Q!SplUtz=BPO_Wp z()G?xJxfMrPUYW8jUm(M_6Ik!t@~B&_;MdSWB7!NkGH)hm@lgqbC*_(ayV)IAfAyd z9|TESTyEQVE4_B!*82e#y(i0F%`4-(II6 zn(8^>Q~x+lPr%B`;CDxC6(NNvVpf#^DckSqOC`(l(l7r5!mV_#X@Ol}?bjKZics6p z4J(IX(O186`dPSybdD@b68_P0G$2z-a{o1SK4Mk?G+~X^d;p{nlR?hdr`p$FuS$wk4Y|2V% zhN;QTew7+0Z(EIF&WGj?jxTJeQ~M>)UW&WFsg`;gS)avOG4=fD`fzoVvbVL|a@|`E z)%d;gsdc9{JKuFYmz$Rg(FteRSP)z3UwfU%vTDv1zTMe))Nydgo5t;F*q-&Lf^!uo zRz7e)|2G>%J>7c1Z%t>WVY{gG&@8La72zvIVg*?DRA%oNiS%n|o=ld3m4Z zj;x+McuTX>%9Qc2zM%d`)v!veDb|%`;)8K!Qrd?Z;s;{UXZQa7`)U*k?)MlUQyYj7 z*-}qq{}w4s6wmd(^0*liOjm3-*ERd{p7`BG22s~Vn^>=U)x^b>{mb^w(|yM&z}a2k55UXg?ix&+b`u z{Sr=%vgVY)`*FPQC;i7I#!7r=a~ErWZjDh-y9<=09TjChu-xsabZ3vb{JD0}`ggvi z&Uq_v$XX8Rl_FP~yJ`}ghC0wRSSVCOW5{TkZw*)#n6}e8*sp@Vi|07H_{eZlw}k4N z1CIthi)HYM0<*9=k)6n{m(n5B3yGh}sCM^iiWql(4M=$G&r5Buh;93EDq-EXgfGgg|=_D7KymLBDhY@dQ0`zVZVCJ545M zpd`&-+g4u!i-i;J5icwCfWB!U1-L7(uAX+f0mv@2@~2-Ry17#9rc6QPY^6s_q)0Xv zKaX3B<`5QmET@9v|BmpJ{1iZdMYdWEPk4c7(C||Jrb|%~QKv3%sCPJe;lOKsl5}>! zwV+_r1(J;V4&3YvLTXXJihR(thbK{Zrmjqx1uS7v7N(`c7~!6|eyhSkPW|kkZe52} zq;lpa@+yOA4B6<&>&?fNt5u}3a;vR+&P4rtvZneQ`qNfu8S?nT)rz2?T_ z`A~cM?1Y?DC**OY;Jl{3Nt4m8J!?_gWOMzOnZtF(uaAry>iI72^dWytCx$n=OGQsL z!HyZey&H@fDI6MlMl7AN>wEC*WP~b8UZ6z)@ip`I`yCkG!`i%)zs6W7SDFWTx7Txb zdDk#Jw1XoOi*u_vzUgCY?(Ol%Kx}4M>_W?M-CtbWN^Y2l5`Pyn-<-NOFwS9i^l;9+ z!-`LCBU!4(Krv<4MGtKZS1-02SpDM{$GPCui+bQz(p(;E)+;kBF!jOYkYIO^Y{$M8 z27%xPi)P2&;~+L3T{_%QJWWq;4{~i&KTYwa3};?5!ulPTcaomEHEf;Mg62MW{^%7H zBvvVyZB}TwGVd>~uf_z)4D((cIm|OGj{g9eYS==NdWg(V+Ke~0{0M`o9!zdh<0WRb zvj&gO=W00$n>dgtcIyeksF%4ftx-CcrWD`3No;sYxvs3hu_VVv`EoENQ?{@gD|uII zH!JZL>{N}F#3KbG=&p$2CmRE_Z?A)iX%(x02w?s!b&0gIQSLRw=b|AWDh5i5MQ}Os zDFEV&9aKv%EV|g(Be1hej3mIz{6`WPO26&%L;rB9z`+U*XP#3JfO`GdN7UOmkx-*Q z9E-G}{~t$Z8P(+f_wj9XBc-HBGbE%zVt@#Y9u3ktQc6l?Dh-mOJ4PclIz&Jkgn=NS zC@o#m@w>18{e&kwhjVtF?b`MEeBbZaiz@veDgtQxYa4X)ACh$vAio!j@uYGJs`_cO zvuD1wl#W5)w-65LQt1N1m>O*cV(FqWGnB4+j%9&c@C?cb6A2mfLniH)^r*V`s60D} zjp}3ITTQ<(NqXK1kzcB#dNumfD8PYq90vj!^YqbR;e0UXHXLP@7H4#YpG zV%J>u1b~378$p|7U<#9aLil(@0sjDasVIx~I0X_2)(srfxb+wSx%CC&3e5Q1mlT;# z*`d<7n|{2ug6@ByR)dU(KnWP}s=!zLA=Lqh+0di5=KEz2gok+{#e&NqRnZ8AuaJAi zgnK7KeYK64jyL|U2p)h`5AgMgqAlJ*Wu3&^3;4#*-YY4ATX2YEu?h)(kQ?~98+PP0 zOb~$lA>=bhU=__}y?F8l89Vzm{OOu*KB;3G1-gJ2mhUX!Uan?$!@A!0o+*i&KfG#= z*;>Uy>j%_ya{D$w?A389h8r?GpZv=m!0|p`Q$dLBXq?XyPs6+bMy_T%Z6pV(Wq0Je zu3zq#S%6}sVV0k-=ekHYqvxt^;6f_4^&hB*3+5$;>0fIuX%z(PZ!(LTPIoYgC(|UQ z!=0oqGRTMZC?5&Y3n7^MzGHVXK>&`8;;t87qQO`qey_>=40;|T88eI5YGZIA;}5hu z+b?SHtn47uehlaSCHSi~q}{vtXrAo@R`z=u1y?;1bW)MM5SWJ*Zx|i{-kYHKmk-5) z)wR|>WA4v?S^Mop(^%sk;Ygp$5FhdMr-fS6X`oMI|LIxC=i-C&?AtlC8ZvX<&f`5x z<$JWjeyV}0f$7?DaBz1%Wd!R^hmR8+;YfU%#{8Q7dsmV2aaBf*OYqlw$nX?qEf+L~ zt^oJpFixw%h+zD8Kn_0K>gZcJE|I12F0q4GAbQNUk#?y@w6~#JkaX1i&GtR!(|?vlcOKbQZD6pUJ9*OKz$K`F=#z#ZA%}+ST?)gO|KA4kU2?T)`}FeGJ1<7b6)9qP&1XD4vs0w_jtf}|Hbc#$^JoIVe{NBS&A zpxG>hwwyLgh3SKn6Zj>ui3qPPk&Zl`r<3*aJ;jaR_f(vAj#K07q!;g<=W zYxO2RIKgescx(8}z8aTlhEvAiJ6=8@-}*EbFl+#VUp^zujvcBlo#V*Vz+l3m>b;i!%8Sr zP1aufN03zM;KR{y@dnZ;1X}hezN~aGE#b*FYZm&g1wnGUI!NMiuUfbw@#bdkd{g{W z@#OS3Mny2lU|%rQ^zcBltNcN?LIs1#9mDeq@hQ!f*Tr317ZS`qmqAjpuim1}U%qk* zn)YeSzlJ@GLtde8wc}ad2x}pdqaA4-IGVPUSbliQHPZb%4R4Gl#<2m@^QzdiK z_#}8ge9SSN<@eQZpg#FN&aA=6u!a;K3VK~2?)3IshbJd6g{M+Ekp`9t$^a~=d=d{2 zt!e*sa2X56Q2!W;n&p2!R`Y8HSLoE63oMQG^rO0YkL56$TKJ<}p5Z1-5;MMAV0W=d z+iO>@&g*IL*Mgku@AX|MU1Bm1%pea##Ro^y!fp_7i*ATnD4PIH>q_JOVP~QEOIW&$ z@>NcB1C8ppDCiNFZ{oV7VO-}EyLeKTJ0|O(@sOU_z#cqvrV{|1*RJhu%)=Y&i?W?Cw63 z*ubwXhXj){d1x_b#nW@XW8oiwbW|v%EX=m&NlxDUVb4YqBb!Qie`#2YVCZmQ`L<|H z3^AUBaycKp9@Q#XTk*&jMe(!TXb(QU18##7Y94ov@S$V zmpwvwTOhU1m_Mvi`X~nzenUu|5`aRhYQ={bdrW~w=}qxJfCx$r_i#Y&8T|N*U)CEy zKSHzXB&l$J6M#L??CP5zidTb3oO}S|p0!oty=WfMa(aOTR%w`21-8U6bq+oUyllAk z$$#$M_$rumjrqsM!qe>cjsL1a@{z@kdM#qe7lZI9;-y3fZgBzp_3_SNAerzvTpcr$ zn^}}oFWJ~L$XYdL`HUv;4}Uw6HkP}b9FY|V z@O--J9@MCpI?ZKJAU;vkp#e*<@|u8bJHY$|%30_~2CW7zzVoE?p{1WqNh>M&Z}c^T z_y38k&|Hw}+S(_*v3D$HJ zjqZH*$(Cz$q!~&8d;W)Eo1Dn@M}=Mdw_zg_bFq{gpx(G`_8b+&dn9t7nTa)&7HnJZ zb^Y4rae+_Uc>*7aa6b%+xI5q@q+^~W-RwJcAu5zw{fCN!k3^15IzpT>U(G-FN$Qit z#+_<1sRxmjFNq8pDp?uW_JUqzk01iVcfd3`+6+eRej*U#=6Qkgk*usd^I0*|pY_NY z1@l2(dil6-+U0Ye*Ri$ARcccg*sZ~P7lCZ5SGA%gsr)<@Tn2E}#`s1cJ-)%zU|F@t zk_5mDqq-A*O{iZm1A-Oln!_JuQrvGX$0b;AC;c@ry|QFsYoxu-`^c#%_%xCv+F9>JprVrA znw9fI3Vnrax*MB%=PNT`;YLzz;xe3osbi7l*NUb|Y@KqVU)j4bo#=??ct7$cY%;1h zI6sV(YF}dUWz%+&Q!9!B{bOtMW=@vlaF#$@8kpi)+2K=8*XI zH}S6b>dnKl(cHAq{)6ScA5tDq8KV`2BW@<_fZ%&fvD1*E;#A|ZkAFD4*~S-|AG;E-Ai>%_ zNl_JyzU^xblIk16*}Zt_srtxY*%4d%9#(qHK3+7mN|QZE@#1#FDnC^7`&>|~Y>y6! z?Bcl%IUD~h=pcCiAL`8#zytrdY>H1HM)3>}QGSSm@0V?Xc0M^|;KL~Y*Rt*VXY;^N zMq8#wgl+PsyN;X&p{<(mkgSJPRfqx+Py=EvG(Ip$kOmp0E9sAbjHUkF`k@@ndff)E zdPx7K&b*wSI0UWh?IF|700TvP3s;Y_{j75z439wPC0CrSNWusi0Sv^Fk=lp{it0@@fS|2^gkG$Hafi zc&&n2M*HoCE%+x&O0XrxOW!()!fl`uT-zJG+#4?#zqQO;3pw)g%d3~*(+UXm^d=XO zS5*p05}cFVuoF6J-~DnNFMK?X#XcJGKHypML-l8RpqG95#xxrY2sG4M5lCI&HgLYX z8qncP9;xAb%`npP$qge3-fI6_h3Vg(p+cOEGa)kDm0ujvjLb(h7n6pq zbL~^p&!sAs*OoF$vwWHQOp&&ei#9SU78`}}wPkZ#X$e9heTyYbUN$+OzJsw2dU8#j zKEmshwGqNzPnDOz^JdY>pN|M@>aw)r7t1wWBVLsWz@eGM7~SdZ4~> zbbZXi=)&LwzII5(nb(xDOyt>m_*i2KNgDTjKw{??r1s={cegPFcXp9TyS4tX`UWYC`C2U8mC;>iWoW+l#PRTAFyG3{wr2ibBGpSY!Lq zCr`CSB2wf=3weq<(l>QFjI5hqKEKQvDaVEE5S-&p{_y8m?8ftNNmoZxD$&%je zf$@6nLa3fqceLS^>)>2|vYRI9b_T+9j)K(ZHM2}iqGrgLDA+}*X);qa<9A0i7TC^0 zL#|=&qbA=o{VhgVSHYD_=47)F{nA9D5SU`84f9Ww?=OHQQRxwg@0Jgwx!ERX!O4X7 z1|WXCCn!2DK>k4r+OPqG<=sGhOn0p?2yLz67MMvjT}N#T#CbE~Uz>w(uO?&iALuo{ z_8j!9p!wwn>SKXR6(XkW_9b)CjJq0C0ap6el9`!w)^;0@Nq~YRa0Y~=3 z)wRDhKWE^d6RjZa;M1*D>*K{Sx&J`Y6m80)m&SP7S+@)3KoUXEIFT?<@d?OK-9(yT zKN}`fgAWeP3?$SR2KBYtu*^Bh*)WdN1`_#pLjeT*ZJ9bDz6V8Hk0^b2GV+!gCHuegA>Jf~YoRh{8bf*{<1E zE$hFiA;lVX$PUc}8k?EK+_nrHNIJSeE@^e$5zd=-8aV)#wS3TI7?Zega^YP1+cl#t-^bJzcCOwSn2z1_}I)GSt2hVkjAq}x5e#lBlK`)ZEb81t6;%SBm&#V zG}R&F*sz30;5wYDu-~nXAUChdCJy58`X2<+>&|Z}fqDvb`YdVvK3s`Vemcc2gJ$pl z5kEqC{$;g!ko$+WOFOh0xkM+Sl>+WF4+9ARp?G8)h!UCKI0lPqJq@@MlN`?Kbt zPQ^xp6ZXVX%v^eZ3{|zq%Zl%5^_OnG!qf52hnIN@u~bCdi~yRJkMcu9SHssjlKz@9 zbcMlLL;rr#GRvJaB-8EE^GK%ot77D2ppb-cob7QVE@onMhNGVviMdpZShLA7-b!!y zk|k>LvI|SFUBQH>kK=ox{^PrU9dHqSyXtl+i57ke+scV*HyH>>Ct#H@wf%k{<5;2x zp$*HiZEWAJICg*ATIsqR$*CG}7&I$MQZDK7-;2jw-#S5NinrMh8T3$d zj!4NBRU2V!(QEd{Ts(8NcwnfZp7$s0zw6@PlTH!oTTmfx<xvpu zN7FuiS^_Xb7C*9sM@;`xExUltTAQ(#Fucqf{nZtKSw@5l@G^G==BSTrD4N1x(_41V z*QMop4CO5!KNEv8xXDy1fMMNw>0u7O?%qAo@Q+i4>l2Wwm|# z5LuEfU2_zb;*xg{NXLi7u^mFIF+y0^ugdNuxk3|gzBm3*a#_6WqtG@qyHB+SF8l%AShZ%bp8{#JOglmI^Nh|94 zPmGTH2wRYm*(iLDPx*B*rth1U|G|d&>o{ZVnF;zI>%!cTnWMe$kYQ{;1G1~*-r7F*xtBViu-swIeVGzmQrurdq2E9%{FTr0bw<6LilsENX2_v z_*-~%`p?Kw;e=!sf;v5IF0!~AA7lrF@y<@kH&b^7$rb*^=8 zhyH8{k5byy!cxlxFpHbc`cxE7Z=Sojsijk{iOrkA>giSsR#c}=_&rA>Ey+v13Q}=+ z6o#0AN47gZCN!W=Ej={sO}drv-%Y~cP?mACCJarWvFn`beabcu+Hd!=7AmDny$1uz z{#aJ`h3InpoMl^il};rJv{}km=?zh|ABTOVwUO6PY z84rR9c(CI;PS`wfoB+}kyh4s|YzVrvJO2R1^j;9PR6-o6z-<|j$`Yh6dxe3(XE_oj z_@O662|9K6xJYFMLKY`L%-on-|C_tdz=K%|4*OB-wkeP$uot1*wbASVktg{v% zOyQB$_7-Tr>C8CEZOhHej=6yY?eMmr~W(-3cTuHs^1E+z}BnNl`Hl zB$v%`*2E6(sj2jO>HazlB6I8RTM9rziaON7rAcqFD4!YSWHZ0kuu(8GaCR_GI8qAJC!CS{+S+3fAiO(3Y(lrG`=S@3hWNZNRPAU3@wnNOPNL%F(;*uF?}})`Diiv$5S>KY5{o{7pH)AQT8&@S7IY7^+M(xZ z!zx~O1cOcn{(yU-S%8;GjJV^o6dF;m=)z!>b=3oqyPhMWQL ztT7W~G94v$7G!8KhUP*)Hn3zDdFuV~m8%NXv(GMh!;#-Qwzv3ZK4nJa-FrozqUo>J zTm56@bfz=AsXHORZ~9t=6c`=DTg8e}5xA6znN_yW@3xzUnOf4*Hm)3|yIxE8=~urh z9O4_&e-}#8nHJ$VH?z=ii!H3)%<&uBAgretUDp z>|W$55sgS+-g?$wTfR_8K;BM_*2xzGNZaVDM)}-4!`1DoMMF^Y_h$(w;6FrsCpq1! z4c`nqe!igp$`lzK-j@5k|D7(=K(@QOB~6im9uN(YYIq!$P4l>T7LxArR6fG~LM7wH z*$sBYr&Yl3?r=7Y`D@0p-^5f`aIr2^UkE4v-$5p;CksIlODXC4I@CRkKQn6HHyn<# zx;f`eRkj_)JegQ`p6cMmb|-CisELxK*$56qcOyDD|8TI>9v=O}eAw<@+VI(T@IjY4 z)A!)+!3x+o&yA49i*#*O^If@SHe_A-1ZwZ#4-yh1~ z0Y5N3#Y$?&b=%|_>Y*wYDmW#$GSdc}9V^vHiy|eYbJ=Aw?|;gw(w@G6c@B5;B@(HC zOXtP$x2bXn`uSeoM`ai$WlY}Ma4D_vsY#Ql?t6g30oLeCq7hK_eSlJH2ZZj?AJ#!l zUVZBL&;N7*P3j06J|T9R@aOh!Fw$PQtM-;F&>!K?{v!<&YZ@W02jonCH17;NAs|C& z_S;H!&;k2B(8#qyCxBuwBd82nc&!E;cy2SZ8BtTW8#hSRR-vt*EgO3M{yhXcGW&8^CPnLb8xJ}92y-U_x$u5~^C^QmnIkB( zXU@=DH3g!tyxKn4J!W!p{4OB)d_7=q;tvACYwfpU>OOB;G94ni?!Umfbi{$DR^Ns8 z36-1R`ync*RWWaje*1lDAm3YHvx1r}=1NCj#mxd(0&L%Jb|<)&-C1`bM7Es88@;aZ zq^3$eFlO?+?j{PuA9P_;uB7nD9sseXdfe=ei7u9#w!ctE=)xZokD1#>M+z<^sJ=ioJM|GrsH(E{ znMd}gYjp8LZNJ03uV-y}{jZW8RuGg>ccT`DKm6u2lm%>nsx|gkt@Beho!EfjO+YaO z*E;K<%|bgpYcBm_>eHkF+n-B{H{pzxUc6{L#XfzrFmE+sqp7ERv5g*;vY5*cQ%QL5 z<7ip`?^8)TTFRkxW3#JGctUdkA_ zrP>sb9&CgfA^u8!LIlH1GKcqQ2y_>*vL!EIG~B+Zm^FCJ3rDru4)Eg$DNd>O(TZ>9 z^2AOu%>Z`eURJKOxgIly*@ulO-4 zE;NJ6;u5Azc=CHZR2rlW$-M?@-p?l07f63g0qPPp;oT;yj>_^wEqvO@8$2TkdhIJ< z#*(Qi&r6Z0Osw*!#ne(7Jr zB&4XsJlL7?zI{7Fxe-nes)Hnzk#E=utQ`nHFMv$66CWz_fqgQOs~0dl>_{HbRS(|0 zOFWas2#AGvfow4yPDxE-e`D@-RgKR##u^ZU+5&?nxboO%x679Y0elpAaTS^c zm3B>mwN-8iIa4jZXaWjAG|*Bo1>3tU{_uGpPC>J9`Mu6-84h#aEw#?=*Uw~~spYSM zGIPO$5#gbfv7V612MjrgJsyN!{^e^4U1AvVtGD`L@ZUsys~c0E$@3S^W&T_ zfG|Mh9|~i9T0`IN%GuO&imaUuc$mHA?fFly_m=L}d)r4_xM&{5*9UV+8YO;W!Lza# z`%`^eQZ1>O!?h~6DWtTGzp+mUyZTxF`9!`%J@0zv?R(X1ak0Cz{BO+g#do*V%WOV`$~0^|V$W}ve(tB$ z9;&2JSF4d>?_TSi?_yw?$5x5VNVRR|=D}O+19-E9sL0(ot^-7K( z;y`Hgg|f({3z+R$Uwx~!>tWf;tzI!M=af*yVkgz+{XgTfA#ra`MaG#8c}zc{6RH1l%jBhWN9W>i0QE zxc~puM`k@3IcUyIxaNph45HnBG zZ(TS31MTQ2=1Wy-2I`026y6d>o>pZ9y9^%O(OBKy{|_|saMC5zy#0)MtJGfN35kA6 zwnXhMJjUmW+^yl~+a^U}SWk!d{7(-okGV6~_~*V>mm04L>70C>VW6t|Z7^xd(*vPA zPSScCIPf8`N0LSFTZeY=T^K}XB1XfqYw-{@ut($&@??QgK2I3BxP#}v#~{65?L`%5 znIK=WY^2nah_i6Vj^Y~bFlzrjCq;J(Ub5TdEbBSRJV(_nd{&HFf zmd)=sC*5%_8DWd)7)YAb*jnPB7P;5%x&P(kv;unAAK9F|3Hnj#G^H(X4<&R*)yeSp zE9c9-)Jad%MQ;qwO-7f&_!GvP+&q3r0J3fT>wcdn$pKz)q>y}Q ze6^@eNBqbCvgheOVPB1DMWyUuxcF5R<^9{`FF8YuSsDKLS(TsU@|q~y(FP-OuN@N7 zofjGmU(KDl2}WR&OQ%bL7%Ds8?07S4;YsY)Sd*grnfV8Hr(-dlC3FscnG8!vzPx9I(yp+*r%Ou317RdRaDThraZYq!pC zgj=>W8{CMCcdF38G=&BDjo+!U>-G%v2gfr4B+LHFJT~qNcDaqf9;pnNdy$1O-bL9f*gA~Hk zVbOMyh~dBWAf+?OHkFFnI0%^+QmYr7SmG?zigKtRPzxCWA+V|07eFK)o|0|N2iDNR z{jTaEr4w@lq%akap5F+`A|P#9woQVX-u${<2EB=N1N^+XUz(La^661%BZsUYTq|+( zGB6B*6CRYVcoZdPBhV4u2u;l_{h6*AGx4$5O%*1Efz=2Eh94VuJ3WHpockCpOL}$K z&?FJ>j9?o6SfKX+B}~$8%P79p2QK05<9PYa6{BB!l=M#oldX_N7E)fXlk1K2p~?*T zF-29uX~h4#N@Xl^`HmW&CZ$ES95g5b^jOu{lQlFDpSM1STy-gMIQj=NyLj@NVfg;S2pv_;Kpz{eg7edxP(B1zY$V{Mb^(ZU%2o69CUH`+#eV;fakFf@B zY`WerfH51=JQm*~f_Gzzx0Q)^K>>_q4$H878S(G-$pwe5}LzQp*lVic<5j883 z9hVs`t+2T3Vzg6w4J85tOyVM_{q?DSwj)$~7~UK8Ww5B5+Y1+6AVAfA$s7e4cguR* zLjx`g=o$c#p=k5wJ^8_ulc*v>@18qq`q&|2qnVg2a|p-L{G=c$R}X2jGL59)YI{(R z?1?kUSYg2u1IpUvptb!Wo(q0rK~W{Yw)25}sJ}NH;dlQ8rSbT{sU;2! zshf2W4u%-Xh>+64u*v+ZAd6QsmqPWb_=js+1RBLc_qkTx$`|RTFWv!(P8E^)cZqaB z$CTaixF|E5BmIvWC)n7VgtBfAZ4n|geQrs2)uR;`^+w$YfO9@?Sq4YPi_C1WO+GyG zXjS2wtwg;0Nmm=3$g&n&LigT9Rqq+$ZuZ}zz(dq`q$|f29@v9GVrK%6^a0;&7^$2_S4@V3&4*oe59p?t%70Cz+zDRX_s8N&n5U;37&^FBuk^KDwjRR z>B^eIb=ti#NZi%y0=^E_Wyw#kzEnyZGR0m#Al~@-90#`{{Uwte$b(jV0;Y7}q{&d~ z(2=U~%H+*Qp~?jLZq|y{9_UQ{<2R!dM&s#e5ve?yCz0Ifdi%!04DB-c3FcNYS=srq zKJdBHiUz0db_!qImZNsG*pbhrDNSIYfi9PG+=a zL&TrSGSg3|(eYb|Y1;YyyN}+x0W^I+b`3ik>7(@-dZXC;&E}LKD>;+OKZBZYgsr#Q zYF%%2rbS<>^NE4x-8^oI z`BLV-Yn7;$Bwuy|=@kOXEt92>oo3hl7QL}6*Fiypg<}udQui8HX;WSbX{7S_&sFJR zObrf)?>tu@8j*$%zY?FUBCnfYq@~;G6CiLj%Wl7QD~nPUJIk7_A2BX% z4kYa-+c{I~+%in*f6{JcIvF-6Gewa1N!odO$h>m%2S5E9ZN$eudHwb2(|h#(y8YEL zeeySM)Y-;L(yJa@iCKyM1!JsGOzX4u?i~SBJ&#TN6-OSP+@bY6ezOW)8pMJgfg8O? zW>lma_XonsdclZMex;x+Q>ei_zf#6niM7?%6UVAnTwa^2mfdZM4R^%S<2Cr3;j*gr+1w$jrJR?_NR5kd-lOgXab^cOG`EpKHhDB=!$1Oh&MA zBQO2I_b>WR%@of517+&`@E+`!)XI~jevz5~m4L!P#5xm6TFbsLRm+zf#2ESudAAo- zqcB-|(=1f!euSL&HRsnEmzJwEIgac~zn%RLgkCMat^W^1;#gO4wn%ncqkt{9gy)&k z6J@E|Ud83_x7^e}u|6BT;qcGI5@2#vs8zmj>5HWZNXW7sQs-PM{_?t%&^_yIGz~@K zijo$FcPsa?tEFjkd%22dy)ul7z}rlpy8A)b_ol;f05>7pFpZ*V$8g(!g<@`OWg2$Q zE$$pM;zIYrgW{exr5K*x1h`WJ*}qMHSY_(Sash#1r}Avm>h@3Isasz>fx5JN{49E% zZ^EwJL+NR@Mrws?YmuhS^h$YEKQE)enN|piEOi&Qm)QViG#QzurWi;SQ%pB6Q@oqX z8aa=lj9youtA6)YL!@MSKdkk5R=gamWBV}lu=CUKau~Njj=v6<(IA_kX3>Xp{8o%& zRKJHQ`prC23iu!+RmnWgRP4pv8UB)-HyW|XJ}YK*e6dzvxAbk9CUDfi9g2aaEiO0} z9k27eQ}oN#mNAx+zIP`V8hQ&|bI2SN!fDk)nZf z8VLvYaNvWEKq9&^n+FCQ1vC|jfj!*Ub(HmcL})yd1(+x@*BbDl&s&?~3p5yY>roWH z5peTIx$RC{0BAf1`mKLJV~M?Xdy>5Sz)F!AtY`eKW^WxNG{<*x!%ncY4J=-O_(4Ew z#UbkcS@yG&nuOyhkiKaa!{)8cBPC{MDG!+XG3p&b*N0-kMrgilk5ORDwS3l(GC^rW zClqh9brbh^fQ!c{+#DiFgw0a7x~1`2?}em9E7oTgRf@&^-l1m5Uwk{`dTKmA!s^Ng zbXtZogOEvi%<^*&hiC^yQ@(A2A5UY1mxIig7DI>0lUTowUg1f>l?!sXK=S&Y057abpl?|zv&M4xb^*^(ZVR)U{`P@25xF%d9@ zHzc}xn39%air{oPgONaKM;Vb@^lo&?$K-gV~G z!`U=($FMj}EiFDw#LNn+f`q4>vKXqRCIs`jS z9Q=l~@34}#`K6c8EHT4swelR!zj*tF6me27*Mq(i#vdah@)=6w@Et4f8o{XWh2%TK zY9>?6ODaSew0Q@f6$N&0=~QkoM*}jU>1I$i^d<-B#?psWAaWT**}bCg7v9nz z)MGs0L{+ZCM;_}@w3K3kTmlfjbBmpG5p&D z5*jI_HRVeJZQ>?&vftf_#Fktzg^D?KLNhKrKx}MkRJCFA0Cj%?ywCD$6(r-bzROOC zl6HF;`hak11kr?YbXxHFRCg~)^#cgnFlaq^4I>@I)>4Xqs-$J!#^HN%MG{)Ptpc<3 z!Yws$|ABzk-1MGu8*M0a&+|LIE0!4(fIccP6g{);TN2+4_{0jJ+(@m};qR2-P(X~Z zj4H}(HhqzNtc^w3RNmZaBc3uZdH-osPNu*NfAhdN zm(M4=a*811OxxVJCTiUCtXms0u{I-zs%nA&;6KvuUO+z+=PCa0QKdF*W5K&3l4b?2 zV{iXZtuHWZAdg7UNs!NO-4RqEUg!C3rM2&xpMh@c94*fFq-tn=nl8ZIcGa5e>{ZGG zXS)spzRV?@T=eiM?^DG4Fo7O^*~OfoJnJfJUe~k8qSatW(jb{=ng{kiLyU*OdrGu2n6Z)M^sHsjba*O9f>1lgeo*=buz5HsZ@8;H;e8xc`ot zoHgM4(2w`;%*y~lhIA7@;}23zRB0zM2UbCZ?$AGZ*yRTn(*l2~QE&;fAgHS<0jP@L zJgf@kp*~nV~z*zgQpEdnIkdQ}LhvA<>$AnYT9^;H`;`CHMOBZt`c|*}#8&Mv% zAq;&MTGx!F5%03c9z%7&P4NheF$ubv;4_FhAHQ^C6UFV7+SvtF?~9ii{vh0wThYr4 z-Qf8!BIY@?MYYF6O`uMr`>wokokeb}hg{^LOG znd$jEVkFboS0CXEy(uSwuXfxu$JovIH8N*>_4IUH8Y`qLQ(|q20kobcZEA=sD3FQk z-5~mD$=0D36e+4UX9jbR8`Em1zD*#V3R1tZ(>HaqT1-134HQL@Xm#NrFh1P_eG;Dc z?aCgd;xYcT{itcoK#WUd3jk^V4+I@RD%wFeoil?v*JsUb)#)pZUSM%pqqoE{JozT` z^)wU7{cjMqo9NPwSAz>>4h1>iXFrvgEYnt>30sw3OJlLqQ8LMW_U-7J<{Sx@WIfeE z>AaZ`bIV(dP(*JGWaCOE492eN#t&saYt zs=mj@oao>UGVT*7Z=oqD+8p7vXxtkzNwBTJv%}WD_=0WATl3|3KgCvl;q+uUd(Xw> zBKUJ^-*1Cag!($V%V3r{Wj?7ZUUT;^!?b_1y~CsrJgw=uTZ;NMq9}g4CUxz_qNXl> zb8aFVlt{i6$B#W;Q$lxf-WbYSAShh^ujt99__Gl*Jr)lldS=jnXtl(pA+u@mx%J?BO=yL-~W-$sytkfFLwy62@h` z83u}5l<)z5{m1_>W#@eLJ3-Na+`WO=G34}a5>kg}*8%_&1WL!=ye=T<5d~Pfvb5=^ zV=%ln(Xw0{@T8RR2*?Ug)FmMFh67}rvZE3_NiBt4XnU!nUxKflt|FW$pb9MpiWV#N z5#q=W_p-|{y!Iw?jSr1Wg=73my$}YnN0(?^G{4d~24LF4u`m6WV&I=-4ib7H&ds4s z+$f)~q=JWk_~icZaZ}!l7K9Q(Qw>=Ooj#I-w4{$y!oA|!vL6|>{*t_5=Wpgo3SUur zMpTvSFLyuV!y!8ifj*szS{?!M*9)dr4}5iOD9Zn*2eXxPj@1&uNJ=(tN^C1J>Skd6 z$g7ds4y;e6Xw85Pah*1jS@6F$LK1qafiTS^I02EW4+`8`T`525cG)8 z=3TNXB)X{3c<#xxFc<9}6dc}*pcs5W`lF;cMU++)wiW{_{dV2)*ZyJet5qPmj(EQ*`1}6@RdlX! z&m?GdIp3ytC}R8Tqc78hMjw?B8GQZvLhs)*lVoEA+jMlW;;t3f{OL~`Gp81FYU;{M zRZB#pme^m-sbQ;0bqIYioU82cNnV?M5mTUZvBKA7KDgt{2-OpA2WJHRHO3^)UsGP> z?+nT$m1lvjNy*02{hyW z2vX^uq;FM6SW~*~%8m_$|J8w&NLObPI=vY0$U zIlS`*t+cT}I41x&ngXx_cG`Ewa(@_mvRU8iK{}gAAvf%dJ=Hy1Afd949s`Mxy~i~{ zFtP$%5y(;-L79&Ou@do_>;zoF@P?~w&Ho2A%foZD^tl7%fF$YWnveV^U4qK4dkivi zk!yu*eifU$5N72x_fS73bFiXdZ1)b_)xgQkh#!Z>%}C-`g%PB6D3E0bl+s}knbaWd z3vZw$lho(f^J7#JH&F$rp$N{k;n9~FFfxoWhsf=F2xT3k!XDF9HoIx#C<3$B*^m9 zJxDJ0!9SZLq(N7HmK$Bt3_pe-`P~aPd;( ze;{5C;7@64{NOf!&ECkFU>9-M_%eyph@b9d{fLypC!2|7NB1jUd=uKkI1e)H#*M>#4qdHqf% zV$#O|dl!-Vz|oL2i^Be~!qh+0)UrDHJmqxdOr8_G-l>XE!K@2^ekn`Knx@(ZF>0!! zeCg6ZX2I4DQU{@1pzUv|;&L^oD9#+&-0f1ZR1=x;?UtSmE3j+zo%Is9lB5Zr*ALN&ld&0?&qT7@bKKh(W z9oJ*{d$kcdY}%j*N#>Yfi+r{=JG4?W!mOdBe7Y^2r*k;g4ws-TH7djxJe*~hW921X z%fuB)u~O0G6jH_<5pv;Pw5a*+x0!3ZJGE$4CgmfD7+q9&N1A=|Bj}liGQ!`8N%_XT z(!AcgGa+{Wxm!~SXJZvoRnr!#4bS%eD)ft3ueO)h zY=J4+$)eHhQ$#L2eme_V8!p+_dK`AkvzvX!>y%dn5M$tl`Js5PRCoodO5!8b+MZLp%gUD@r4xiK}3c8rA(7bT}b2T8)E#KTwUV%Cz^sk`&ZY&#kR>joJlh=fc-XT&F`s(e7N z=8~uJVhI{;c>S@0s>1nFrDkU&$qW5vDB&I4#x$oH`t#=ik5gjaiR1ePpCl!fJz?{J zRA#IEJ3nA`!N0Z^Jt&_WmNjL2Js>ZZIP2)N*l8ogsYvF7suSqP{U1l?8PE3nw&5i9 zti7pCg4%naPC-l_Bw} z|8fPD2>A3n(;uL5baW~({liXnxwYex7-EHM`NZvc&9+HZ6a00BeDKuH`wJu0x| zUPA7jFiCMb-InTo;9Y0a5^csP$!Z^CK=HJQF=wxvpo0kZnpfGjO}E3aU;=rLPL2*_ zmzA8VVMzYn7+lW4DTmmn+qiRtN$h2@a-501^Lu2PqvgAzVrC0TU0AzX1Xf7^C0IrW z2R2YNjq;-meyyYD0s)mler{6y)Xc6NRMVKxHq%tYUj2SxC3HLs5Uhj@+pwdOD}TSA zRh)u)BTOCh4sjVtpAhM}gcCB|;m?+vn4*870{4gmtzu)L}(NGZR7&9KQK z_AXBB*BFU1n{K@@_oM##Ui_C|QFPUzF?}H!ZCVyAyGn}waxk+WC59L1a)q|E0Q?Vv1YbX7vm!DN!7Ok*AZqEo}pivA|z^a-m! zJI!VKmb~cM19t9(U1DhVsa1*!3D@S><$OtQCV^TyAYLW{uJg~(&&rhi!ZwNM`y)s3GR0~M;-_AT zSd8b#h6sX4L}U&<{4PGa$~ltU?2!CKYkxjdg3VU%n{-#ay1a!UYinEa5M*F_0aWS* z+N5^^eJBZcVY}m2K7eSGvKp2xAWgm5G?LU;S1XHQ@9yHdS;xN+G^tAIfl3*;9L@0K zc=>vj*pGT}mHw~7&k@;MPTJ2vB(bJNUe5o@TxjT~ACJ*La`htS`ERSW%xa%a*7|wt zs$)qq?)ptx5jcn^Ns07DbU`eM&WFK}3LjKe(7;*~)#vNdGx`6+?Q4X%EV`9})ed)v&tpl3E-Ud7{@^hZbHD>?t`ckrfs zS&m}kIqHyt4vlKUoSft+8iEPfDIzbjl1s0X7!#5Q|C~N&j_aJH#_ftCHpUv#?!haq z)>muJGTt}%r6Cg{)`quZ8TE{CA-LZ;L809_UuNZNJyx4O54A+q$5Y307C|~5%vni` zIWoZ5&8oy^KlI#2{Rj9RPEe>?FCMO9s{DqlePhPmHFM5b>YMg)>Tyem&hFXOicL3> zpiKRY#VYa7h*~5#c6N9~SZtfq*DkWL-`}8(W$x#Rl^J;aG|lB{@OIkS6NE{7=&+P{ zaoz@z-*IcWsM_vT6{@h$4fg$mpOfR$;It$Gh;6&H?CCL+dz_N@YTfheu4TcKKo#@G zn$n1S_R*zPMZp;c3KQG4(yf|RzJ&56o%MCTkIz9SX=-6l1v!4Z8~>R2Bw6h@r`Pi; zUhrjPs5VEET}gWGXHmJi)X&nN%hfaI4^WLiKw%9+JdD}KY5$5Y?u$s(vW|C5CTy1c z5*v|KxjB5;vHb?iK9&_KCD;ZJ8tg(N!&CLc#+aF=&BXXCUum5k6N&GXO*}n{+1oAQ*bt3+cDLUmEVjUA{N5k(srFU->mTyWNCHW6U$aeklSZe9K-bltsA>!{?Y_BNH zE5EH)o4!NpU3X7>1o8Po7&?CEYBu}E{Y=Er88$bB(F^$GPjlq{`5ldUokG^$-xR+M z^1AA{_Xef&6E=^mV4HS5wY2Jj+r1U6NXXA7+Ii!v)YYHFI0l#YzzrtEpV2r>&L0`} z`_)_*Ji?^p67LLMAhK4Oa~pkuf<9o3(*Zx_E)F^id?%WJj+U^-6A6!d`l+O4p{b-= z(|9?}tr37#zF^lm+SSZ?!^tr8CZ@dHsK{o;7?UwLPx{G#W0FA07Wf$BV6W zhy0i&eoys?^yO|zk->j%x`Dee8&08gL5*{Os))OOaQnV&ZMvDg8nh?LweJ0=oKKh= z4BgLlR&)+(G~wwOH4-I4I(J;=1hqA$@@Mj;jpe_)L*{3Bc?g6j zsW=TTRMlpK@0RWq?F^ix<53>+aH;U#-RTiqrDHW5s-65GXtR-DQ_GIpcW|0Z3a8XwCRuHEl!@UNF(PF&r^Yjk z-OWdv__n{KM1)?-BwF6vj-p_+`Mro z9|LWXm+&3T2H=-7b!yWdKuFXKY}x)3{c!A~=GW*DG!p_tIwwGQP6<*hgP9TIe-24d zi|WHGD5SE>|FIFN#LEIM4j`FuO|exXNY@CKPDI6%o$)U3%78570N9`h47A^z0fMzi zAetxb&X1DBM+_ubgV<3Tb^%?0Wj>^(N%{w|9mGOgJj$ONPM<~P2>txAxzz-(r|d~S z9!{QCb4e5q`(fnIY8|L;UsPI+^;>X1TSRr&&;E0ROmxYRSnE2m!f!GDE0dK~E&1#s zX*2RsLMSej)gPE7ccshg+lp;Z#tkJtma7G(DJxX7Srff70sCHNP*AR%Q*ObyuD_LxgwDyRKi%}WqvV0XiZK}|XAw~{@+ zSWs-5dVgEpkwXe%*j5f(!gT^HR;^Nl%OBa#7X8t`{97>I_fRO8g^;T%^HtHFWF17v z#QHMCo7TNm{~+6h{VE3C_>f43Sr`@@0lb%|b}a$1Kwc+gkPvKkmlps!s@7Jf%?xk9 zE)iZ`mPu$GkSV7Jh}YxqcE;7bO5gB<0v;Sanm+yQMkb*?@6g6o1sr_l^5;12Go?4x zFOg%>V#U~wSq760@W5sD<4jk(wd6VuiUcyi39mA$k2j*aEvTaqtXSpjNusoA&Bcx* z08>BZr1!u48T@UI=DX*!Pc12LD4v)S2HSt)z?~LsM(k?uf8DCcb2)5Sfwo+v`>Sy^qWrsvUbHG@=wE}UnXW@h8EnL_l zE?B_799Wog=u#$0l-ce615khSh;A=STFLCs;x-g4;KnwkFapg`MBZ*VysozY-gPf= z4@kR&ZF!SAUj790+S$PAj&kEEdgo;Uxuw12m%2*T$6wGNUPQ`2#jQYGEPvm%;FlbC z?`sL(%NOFO0~klw$_35&`15InOqlf!4IC|Sz2ZGGZR?JEOeMui`&#R2cJv#ROw&E0 z*Zk#8-Nn`h=h4HuCAvaOg@f2{(c3Cn{{I1F9UX4(q<3$P2(P}NDBT3cFpT#tRS#?(Hrv&y64yYulU}G>$2bWhdP;}Kegj`?Ju^aE}qg_A@6(46Vx+R zEV5#7lDM(x5%*I*%L~sh?X({u%#9LKgTG64Y8&Nhy{ zoP`-!cxFooR7%@|ymEPMnUp0_k^&=(jXno&4AI;b!$njzs)`K zGUpR`|1vehOhxd1UA4NJwN3B+U`qJxntT$SW)YJ~GB&-MZ*RkMdFJHyU*;o+_o8(b zx-8csf~&1H4gT+Bwf)a;pM9 zy|Z>PEQlwe%Hp_f(tTS>;XnF~IsRK+N5j#6Z!#lB9Gp}&6D5nET>s(VG~SkbVd>qq zGVmV&85?|JdQnJ(WcyM7!ZJPjtdYeW^P6CWQ+WDMYvx%0vGx^m^h2F#r{_Y@<0wO1 zNO8!v#c^;i*##l}g;)j|M%;%PD0WIFz#9g`ldDp zDurbZfMK}JIofuK8>;%L_3EJ;+1<>iiMJxR#>GW_t=`s;!OUzTqIH^I`w=Z`g_#pmawWWO zWV|n1YrDuQ0Q(+BbS`*#Ihl(g%qk+~*o*p0?Wrk6nMo2_Je>He9W0X+Bii>&2Fwf4 z{K#>*8v}$&qm0wNmTE7G(&pWdGTZV!fZ|0NNne#66_Z)0BVI0yXptf7B@&xDh)%Un zbJ7lYs&V}tRkNx-H{N@Ly6T$%)~qI}nZYN3BHqD&^-O&G*agA*$Q1ha0S` zP5^oM2}DClA_+^qcW=hx;vkXoB`gs6HFpH4vJAspjQ+MJJ{dMb9A8Ob&0QEcTB(a| zlomF9rq>77wWp!3!+gF{fHED;<)^MC0dZ4TrE>6L^mSrKZmYsAIcd zUCpf59}T|qtL}GI!0N-K%+xT?c*xx37g_>d1!KI>uW=;00l7uhCFB9CE55q0N&Rgl z^zPmpR?{Nk9jbOxP|khdJ7h`?b>)hr3GiEv3Ba|8$l2SzCv6IRT5reR3D6Kw@Vh6h zn*O1{gNBIz0IeClcEv@3wTbDy>uxaC-$>n{S%shjj>G$fU%cK&br!5D;I8AAC~`|Y znBu{AXZ-Gz0ZNu4>vYI_={B#<-b`JUQ@xA2%&Q#mxz;*|g_qoQ4lD-;-!C7=;3Qrn z>U@imvprEw>x>si7nq5yD3c|Y)h!8nA-^Zs1e=@7e=AQ%+)pwVtkg9H2jzRO7?wK1 zizq)eGH$0XQ?16**%Qv6~p1;7k{<7V-)9tNDg0vQ2W=CdeF)J+2(Ruq`^e z;SVX%Zf!j$(^Ith9H6_ zLyd;96!!0y&ENWeJD$M@4ab3;WYku>&hreF4dPn4ld0-bQ3lMpk8EPq{=QaR*5HL9 zc^;r%&%iLFjxJA)IN{Oa1*Y@Q@7rw4a)Rf$Y#WQQW7))6-`|#?jr34)=*HIWf3`m@_RIX1dfb8qXSTlMI|&6D_4e6N4S= zENx`rZ`UUlDt_~nNvK^e#kZrAJ{XT5Y43M5--@gGVteIAMG|MIc6ox1n0edyD=HWb zp)0tkYDfDHOU(0dzK`%)w-7ne`1054%Scnh{UIAmXw37n`|rPM)_o8|1t+syn~vu* zFjN%p5%=gllev|FN25Qfz7eRea_4Vf)uqRcI?m9UO3!G!H7`r0k=7&x*3dr;r5s*2 z%eRsikPx4B!0H85KMgDwH$H<4f<+PRZH?IAe_y%18XHaA4uM>bEViwRW0L%=%voz5 zv1S$|H;6dgaSd9eqr%D>X9IdNO(WLvgVD9yjf@58cmQwHwgUm9>3GO5l+c;O0|ytl zpaya;IZ=JIfE(QxNZm_uI!&F^%E; zTOE!aOA-%OTOi3SimJu%9V7?{Xs{ai153^h4xXjRwMOH^UbWkKE+ZW8d(Ms_7^-SV z4q@1W6=FIY;FBUnEA2h37Iu{|Ttzq$8jW%=F>nrmOYfur6pa z$*0$8?H7*x{v6d_YTF!>>`Q-Sct&N`pu$S|d6mytO`budu2AU{j4+aA2Ke_MZiTpij$jlv;hgFb$S z>NeTDjyLaqh*-Z$hn3Jyhv1BxQq3tb@@*zF0?|tk?66X8o!9L^Z**GhOD_PSw`krz zrAPyg=VP0A#F9EZb@G1Ch56IRi|~by&Q_9ZR0Y_{jMXF?A9t%uY_O8&fEe1Fa;PBg zDsnxT>di^*K%#EYA7^GMPDy4^@KF)Fl9$C3TZ1tx*l!k`wB?ux?@URalc5)i$6{RO zvXSb(b6z8iz$&3Rm6~>dToG7YN~0a6D}hSGjyUgQzbafJrF!c0l<}6(bM{ZeM<#}3`ZVRx)#Gl z+#cZd&mD_Nq2M7lc=%u0BiK1_ca~rLZ|4Aho*M5c{^g56;gB~Oe%h&;g+}VmN$_e3 z--57&brV0G@(z?5R{S}QZuj#swjp&(S09vSkY@_dq#2?xZ~1`;*TQRxg`in^W$)zx z367ys@A;*Iz@VNR2QEEN&ptAywP*t6%Ky(R2EP0UKrC)Axaaf;x2;!R_j=5!!vA

4gDC6R0g* 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 aDe0Wv11%-b*^;WwQM4{)>ZOFhfB)HK*|b{# literal 0 HcmV?d00001 diff --git a/Example/Paystack iOS Example/Images.xcassets/caps.imageset/paystack-cap.jpg b/Example/Paystack iOS Example/Images.xcassets/caps.imageset/paystack-cap.jpg new file mode 100644 index 0000000000000000000000000000000000000000..544d8d810e4f683e93049e2ecd5a77391856e67f GIT binary patch literal 222251 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­(g*iwKV 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%0A?S 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

4gDC6R0g* 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 aDe0Wv11%-b*^;WwQM4{)>ZOFhfB)HK*|b{# literal 0 HcmV?d00001 diff --git a/Example/Paystack iOS Example/Info.plist b/Example/Paystack iOS Example/Info.plist new file mode 100644 index 0000000..6905cc6 --- /dev/null +++ b/Example/Paystack iOS Example/Info.plist @@ -0,0 +1,40 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Example/Paystack iOS Example/Paystack iOS Example.entitlements b/Example/Paystack iOS Example/Paystack iOS Example.entitlements new file mode 100644 index 0000000..0c67376 --- /dev/null +++ b/Example/Paystack iOS Example/Paystack iOS Example.entitlements @@ -0,0 +1,5 @@ + + + + + diff --git a/Example/Paystack iOS Example/ViewController.swift b/Example/Paystack iOS Example/ViewController.swift new file mode 100644 index 0000000..a49f4f9 --- /dev/null +++ b/Example/Paystack iOS Example/ViewController.swift @@ -0,0 +1,153 @@ +// +// ViewController.swift +// Paystack iOS Exampe (Simple) +// + +import UIKit +import Paystack + +class ViewController: UIViewController, PSTCKPaymentCardTextFieldDelegate { + + // MARK: REPLACE THESE + // Replace these values with your application's keys + // Find this at https://dashboard.paystack.co/#/settings/developer + let paystackPublishableKey = "" + + // To set this up, see https://github.com/PaystackHQ/sample-charge-token-backend + let backendChargeURLString = "" + + let capPrice : UInt = 10000 // this is in kobo (so 100 Naira); + + let card : PSTCKCard = PSTCKCard() + + // MARK: Overrides + override func viewDidLoad() { + // hide token label and email box + tokenLabel.text="" + tokenLabel.hidden = true + chargeTokenButton.hidden=true + emailText.hidden=true + requestTokenButton.enabled = false + // clear text from card details + // comment these to use the sample data set + super.viewDidLoad(); + } + + // MARK: Helpers + func showOkayableMessage(title: String, message: String){ + let alert = UIAlertController( + title: title, + message: message, + preferredStyle: UIAlertControllerStyle.Alert + ) + let action = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default, handler: nil) + alert.addAction(action) + presentViewController(alert, animated: true, completion: nil) + } + + func dismissKeyboardIfAny(){ + // Dismiss Keyboard if any + cardDetailsForm.resignFirstResponder() + emailText.resignFirstResponder() + + } + + + // MARK: Properties + @IBOutlet weak var requestTokenButton: UIButton! + @IBOutlet weak var tokenLabel: UILabel! + @IBOutlet weak var chargeTokenButton: UIButton! + @IBOutlet weak var emailText: UITextField! + @IBOutlet weak var cardDetailsForm: PSTCKPaymentCardTextField! + + var tokenString: String? { + return tokenLabel.text + } + + var emailAddress: String? { + return emailText.text + } + + + // MARK: Actions + @IBAction func cardDetailsChanged(sender: PSTCKPaymentCardTextField) { + requestTokenButton.enabled = sender.valid + } + @IBAction func requestToken(sender: UIButton) { + dismissKeyboardIfAny() + + +// card.validateCardReturningError() + + // Make sure public key has been set + if (paystackPublishableKey == "" || !paystackPublishableKey.hasPrefix("pk_")) { + showOkayableMessage("You need to set your Paystack publishable key.", message:"You can find your publishable key at https://dashboard.paystack.co/#/settings/developer .") + // You need to set your Paystack publishable key. + return + } + Paystack.setDefaultPublishableKey(paystackPublishableKey) + // use library to create token request and return a token + if cardDetailsForm.valid { + PSTCKAPIClient.sharedClient().createTokenWithCard(cardDetailsForm.cardParams) { (token, error) -> Void in + if let error = error { + print(error.description) + } + else if let token = token { + self.tokenLabel.text = token.tokenId + self.tokenLabel.hidden = false + self.chargeTokenButton.hidden=false + self.emailText.hidden=false + } + } + } + + } + + @IBAction func chargeToken(_: UIButton) { + dismissKeyboardIfAny() + if let _ = tokenString { + if let e = emailAddress{ + if e.isEmail{ + + if backendChargeURLString != "" { + if let url = NSURL(string: backendChargeURLString + "/charge") { + + let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration()) + let request = NSMutableURLRequest(URL: url) + request.HTTPMethod = "POST" + let postBody = "token=\(tokenString!)&amountinkobo=\(capPrice)&email=\(emailAddress!)" + let postData = postBody.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) + session.uploadTaskWithRequest(request, fromData: postData, completionHandler: { data, response, error in + let successfulResponse = (response as? NSHTTPURLResponse)?.statusCode == 200 + if successfulResponse && error == nil && data != nil{ + // All was well + let newStr = NSString(data: data!, encoding: NSUTF8StringEncoding) + print(newStr) + } else { + if let e=error { + print(e.description) + } else { + // There was no error returned though status code was not 200 + print("There was an error communicating with your payment backend.") + } + + } + }).resume() + + return + } + } + showOkayableMessage("Backend not configured", message:"You created a token! Its value is \(tokenString!). Now configure your backend to accept this token and complete a charge.") + return + } + } + showOkayableMessage("Email not provided", message:"You should enter a valid email!") + return + + } + showOkayableMessage("Token not obtained", message:"You need to create a token before calling charge.") + } + + +} + diff --git a/GUIDE.md b/GUIDE.md new file mode 100644 index 0000000..e6ab0c1 --- /dev/null +++ b/GUIDE.md @@ -0,0 +1,253 @@ +# Guide + +If you want to build a mobile app like [Afro](http://www.getafrocab.com) and enable people to make purchases directly in your app, our iOS libraries can help. + +Accepting payments in your app involves 3 steps, which we'll cover in this guide: + +- Collecting credit card information from your customer +- Converting the credit card information to a _single-use_ token +- Sending this token to your server to create a charge + +## Getting Started + +### Step 1: Install the library + +#### Using CocoaPods + +We recommend using CocoaPods to install the Paystack iOS library, since it makes it easy to keep your app's dependencies up to date. + +If you haven't set up Cocoapods before, their site has installation instructions. Then, add pod 'Paystack' to your Podfile, and run pod install. + +(Don't forget to use the .xcworkspace file to open your project in Xcode, instead of the .xcodeproj file, from here on out.) + +#### Using Carthage + +We also support installing our SDK using Carthage. You can simply add github "paystack/paystack-ios" to your Cartfile, and follow the Carthage installation instructions. + +#### Manual installation + +We also publish our SDK as a static framework that you can copy directly into your app without any additional tools: + +- Head to our [releases page](https://github.com/PaystackHQ/paystack-ios/releases/) and download the framework that's right for you. +- Unzip the file you downloaded. +- In Xcode, with your project open, click on 'File' then 'Add files to "Project"...'. +- Select Paystack.framework in the directory you just unzipped. +- Make sure 'Copy items if needed' is checked. +- Click 'Add'. +- In your project settings, go to the "Build Settings" tab, and make sure -ObjC is present under "Other Linker Flags". + +### Step 2: Configure API keys + +First, you'll want to configure Paystack with your publishable API key. We recommend doing this in your AppDelegate's application:didFinishLaunchingWithOptions: method so that it'll be set for the entire lifecycle of your app. + +```Swift +// AppDelegate.swift + +import Paystack + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + Paystack.setDefaultPublishableKey("pk_test_xxxx") + return true + } +} +``` + +We've placed a test publishable API key as the PaystackPublishableKey constant in the above snippet. You'll need to swap it out with your live publishable key in production. You can see all your API keys in your dashboard. + +### Step 3: Collecting credit card information + +#### Test Mode + +When you're using your test publishable key, our libraries give you the ability to test your payment flow without having to charge real credit cards. + +If you're building your own form or using PSTCKPaymentCardTextField, using the card number 4123450131001381 with CVC 883 (along with any future expiration date) will accomplish the same effect. + +At some point in the flow of your app, you'll want to obtain payment details from the user. There are three ways to do this. You can (in increasing order of complexity): + +- Use our pre-built form component, PSTCKPaymentCardTextField, to collect new credit card details +- Build your own credit card form from scratch + +#### Using PSTCKPaymentCardTextField + +To use our pre-built form component, we'll create a view controller called PaymentViewController and add a PSTCKPaymentCardTextField property to the view controller. + +```Swift +// PaymentViewController.swift + +class PaymentViewController: UIViewController, PSTCKPaymentCardTextFieldDelegate { + let paymentTextField = PSTCKPaymentCardTextField() +} +``` + +Next, let's instantiate the PSTCKPaymentCardTextField, set the PaymentViewController as its PSTCKPaymentCardTextFieldDelegate, and add it to our view. + +```Swift +// PaymentViewController.swift + +override func viewDidLoad() { + super.viewDidLoad(); + paymentTextField.frame = CGRectMake(15, 15, CGRectGetWidth(self.view.frame) - 30, 44) + paymentTextField.delegate = self + view.addSubview(paymentTextField) +} +``` + +This will add an PSTCKPaymentCardTextField to the controller to accept card numbers, expiration dates, and CVCs. It'll format the input, and validate it on the fly. + +When the user enters text into this field, the paymentCardTextFieldDidChange: method will be called on our view controller. In this callback, we can enable a save button that allows users to submit their valid cards if the form is valid: + +```Swift +func paymentCardTextFieldDidChange(textField: PSTCKPaymentCardTextField) { + // Toggle navigation, for example + saveButton.enabled = textField.isValid +} +``` + +#### Building your own form + +If you build your own payment form, you'll need to collect at least your customers' card numbers, CVC and expiration dates. + +### Step 4: Creating Tokens + +Our libraries shoulder the burden of PCI compliance by helping you avoid the need to send card data directly to your server. Instead, our libraries send credit card data directly to our servers, where we can convert them to tokens. You can charge these tokens later in your server-side code. + +#### Using PSTCKCardParams + +If you're using PSTCKPaymentCardTextField or your own form, you can assemble the data into an PSTCKCardParams object. Once you've collected the card number, expiration, and CVC, package them up in an PSTCKCardParams object and invoke the createTokenWithCard: method on the PSTCKAPIClient class, instructing the library to send off the credit card data to Paystack and return a token. + +```Swift +@IBAction func save(sender: UIButton) { + if let card = paymentTextField.card { + PSTCKAPIClient.sharedClient().createTokenWithCard(card) { (token, error) -> Void in + if let error = error { + handleError(error) + } + else if let token = token { + createBackendChargeWithToken(token) { status in + ... + } + } + } + } +} +``` + +In the example above, we're calling createTokenWithCard: when a save button is tapped. The important thing to ensure is the createToken isn't called before the user has finished entering their card details. + +Handling error messages and showing activity indicators while we're creating the token is up to you. + +### Step 5: Sending the token to your server + +The block you gave to createToken will be called whenever Paystack returns with a token (or error). You'll need to send the token off to your server so you can, for example, charge the card. + +Here's how it looks: + +```Swift +// ViewController.swift + +func createBackendChargeWithToken(token: PSTCKToken, completion: PKPaymentAuthorizationStatus -> ()) { + let url = NSURL(string: "https://example.com/token")! + let request = NSMutableURLRequest(URL: url) + request.HTTPMethod = "POST" + let postBody = "token=\(tokenString!)&amountinkobo=\(capPrice)&email=\(emailAddress!)" + let postData = postBody.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) + session.uploadTaskWithRequest(request, fromData: postData, completionHandler: { data, response, error in + let successfulResponse = (response as? NSHTTPURLResponse)?.statusCode == 200 + if successfulResponse && error == nil && data != nil{ + // All was well + let newStr = NSString(data: data!, encoding: NSUTF8StringEncoding) + print(newStr) // All we did here is log it to the output window + } else { + if let e=error { + print(e.description) + } else { + // There was no error returned though status code was not 200 + print("There was an error communicating with your payment backend.") // All we did here is log it to the output window + } + + } + }).resume() +} + +On the server, you just need to implement an endpoint that will accept the parameters token, email and amountinkobo. Make sure any communication with your server is SSL secured to prevent eavesdropping. + +-------------------- + +### How to implement payment on your server +Create a charge by calling our REST API. An authorization_code will be returned once the single-use token has been charged successfully. You can learn more about our API [here](https://developers.paystack.co/docs/getting-started). + + **Endpoint:** https://api.paystack.co/transaction/charge_token + + **Parameters:** + + + - email - customer's email address (required) + - reference - unique reference (required) + - amount - Amount in Kobo (required) + +**Example** + +```bash + $ curl https://api.paystack.co/transaction/charge_token \ + -H "Authorization: Bearer SECRET_KEY" \ + -H "Content-Type: application/json" \ + -d '{"token": "PSTK_r4ec2m75mrgsd8n9", "email": "customer@email.com", "amount": 10000, "reference": "amutaJHSYGWakinlade256"}' \ + -X POST + +``` +###Using the [Paystack-PHP library](https://github.com/yabacon/paystack-php) or [Paystack PHP class](https://github.com/yabacon/paystack-class) +```php +list($headers, $body, $code) = $paystack->transaction->chargeToken([ + 'reference'=>'amutaJHSYGWakinlade256', + 'token'=>'PSTK_r4ec2m75mrgsd8n9', + 'email'=>'customer@email.com', + 'amount'=>10000 // in kobo + ]); + +// check if authorization code was generated +if ((intval($code) === 200) && array_key_exists('status', $body) && $body['status']) { + // body contains Array with data similar to result below + $authorization_code = $body['authorization']['authorization_code']; + // save the authorization_code so you may charge in future + +} else { +// invalid body was returned +// handle this or troubleshoot + throw new \Exception('Transaction Initialise returned non-true status'); +} + +``` + + +**Result** +```json + { + "status": true, + "message": "Charge successful", + "data": { + "amount": 10000, + "transaction_date": "2016-01-26T15:34:02.000Z", + "status": "success", + "reference": "amutaJHSYGWakinlade256", + "domain": "test", + "authorization": { + "authorization_code": "AUTH_d47nbp3x", + "card_type": "visa", + "last4": "1111", + "bank": null + }, + "customer": { + "first_name": "John", + "last_name": "Doe", + "email": "customer@email.com" + }, + "plan": 0 + } +``` + + + +### 5. Charging Returning Customers +See details for charging returning customers [here](https://developers.paystack.co/docs/charging-returning-customers). diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..be7f503 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2016- Paystack, Inc. (https://paystack.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. \ No newline at end of file diff --git a/Paystack.podspec b/Paystack.podspec new file mode 100644 index 0000000..9461d79 --- /dev/null +++ b/Paystack.podspec @@ -0,0 +1,31 @@ +Pod::Spec.new do |s| + s.name = 'Paystack' + s.version = '1.0.0' + s.summary = 'Paystack is a web-based API helping African Businesses accept payments online.' + s.description = <<-DESC + Paystack makes it easy for African Businesses to accept Mastercard, Visa and Verve cards from anyone, anywhere in the world. + + This is the Paystack SDK for iOS. Collect Card details on iOS and get a token. Shoulders the burden of PCI compliance by helping you avoid the need to send card data directly to your server. Instead you send to Paystack's server and get a token which you can charge later in your server-side code. + DESC + + s.license = { :type => 'MIT', :file => 'LICENSE' } + s.homepage = 'https://paystack.com' + s.authors = { 'Ibrahim Lawal' => 'ibrahim@paystack.com', 'Paystack' => 'support@paystack.com' } + s.source = { :git => 'https://github.com/paystackhq/paystack-ios.git', :tag => "v#{s.version}" } + s.ios.frameworks = 'Foundation', 'Security' + s.ios.weak_frameworks = 'PassKit', 'AddressBook' + s.osx.frameworks = 'Foundation', 'Security', 'WebKit' + s.requires_arc = true + s.ios.deployment_target = '7.0' + s.osx.deployment_target = '10.9' + s.default_subspecs = 'Core' + + s.subspec 'Core' do |ss| + ss.public_header_files = 'Paystack/PublicHeaders/*.h' + ss.ios.public_header_files = 'Paystack/PublicHeaders/UI/*.h' + ss.source_files = 'Paystack/PublicHeaders/*.h', 'Paystack/RSA/*.{h,m}', 'Paystack/*.{h,m}' + ss.ios.source_files = 'Paystack/PublicHeaders/UI/*.h', 'Paystack/UI/*.{h,m}', 'Paystack/Fabric/*' + ss.resources = 'Paystack/Resources/**/*' + end + +end diff --git a/Paystack.xcodeproj/project.pbxproj b/Paystack.xcodeproj/project.pbxproj new file mode 100644 index 0000000..b1d7137 --- /dev/null +++ b/Paystack.xcodeproj/project.pbxproj @@ -0,0 +1,1369 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXAggregateTarget section */ + 049E85221A607FFD000B66CD /* PaystackiOSStaticFramework */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 049E85231A607FFD000B66CD /* Build configuration list for PBXAggregateTarget "PaystackiOSStaticFramework" */; + buildPhases = ( + 049E85281A608030000B66CD /* MultiPlatform Build */, + 04B33F321BC744D100DD8120 /* Copy Files */, + ); + dependencies = ( + 049E85271A608027000B66CD /* PBXTargetDependency */, + ); + name = PaystackiOSStaticFramework; + productName = Framework; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 042CA1B61B7BD84100AF0DA6 /* pstck_card_placeholder_template.png in Resources */ = {isa = PBXBuildFile; fileRef = 042CA1B31B7BD84100AF0DA6 /* pstck_card_placeholder_template.png */; }; + 042CA1B71B7BD84100AF0DA6 /* pstck_card_placeholder_template@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 042CA1B41B7BD84100AF0DA6 /* pstck_card_placeholder_template@2x.png */; }; + 042CA1B81B7BD84100AF0DA6 /* pstck_card_placeholder_template@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 042CA1B51B7BD84100AF0DA6 /* pstck_card_placeholder_template@3x.png */; }; + 0433EB491BD06313003912B4 /* NSDictionary+Paystack.h in Headers */ = {isa = PBXBuildFile; fileRef = 0433EB471BD06313003912B4 /* NSDictionary+Paystack.h */; }; + 0433EB4A1BD06313003912B4 /* NSDictionary+Paystack.h in Headers */ = {isa = PBXBuildFile; fileRef = 0433EB471BD06313003912B4 /* NSDictionary+Paystack.h */; }; + 0433EB4B1BD06313003912B4 /* NSDictionary+Paystack.h in Headers */ = {isa = PBXBuildFile; fileRef = 0433EB471BD06313003912B4 /* NSDictionary+Paystack.h */; }; + 0433EB4C1BD06313003912B4 /* NSDictionary+Paystack.m in Sources */ = {isa = PBXBuildFile; fileRef = 0433EB481BD06313003912B4 /* NSDictionary+Paystack.m */; }; + 0433EB4D1BD06313003912B4 /* NSDictionary+Paystack.m in Sources */ = {isa = PBXBuildFile; fileRef = 0433EB481BD06313003912B4 /* NSDictionary+Paystack.m */; }; + 0433EB4E1BD06313003912B4 /* NSDictionary+Paystack.m in Sources */ = {isa = PBXBuildFile; fileRef = 0433EB481BD06313003912B4 /* NSDictionary+Paystack.m */; }; + 0438EF2C1B7416BB00D506CC /* PSTCKFormTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = 0438EF261B7416BB00D506CC /* PSTCKFormTextField.h */; }; + 0438EF2D1B7416BB00D506CC /* PSTCKFormTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = 0438EF261B7416BB00D506CC /* PSTCKFormTextField.h */; }; + 0438EF2E1B7416BB00D506CC /* PSTCKFormTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = 0438EF261B7416BB00D506CC /* PSTCKFormTextField.h */; }; + 0438EF2F1B7416BB00D506CC /* PSTCKFormTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 0438EF271B7416BB00D506CC /* PSTCKFormTextField.m */; }; + 0438EF301B7416BB00D506CC /* PSTCKFormTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 0438EF271B7416BB00D506CC /* PSTCKFormTextField.m */; }; + 0438EF311B7416BB00D506CC /* PSTCKFormTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 0438EF271B7416BB00D506CC /* PSTCKFormTextField.m */; }; + 0438EF351B7416BB00D506CC /* PSTCKPaymentCardTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 0438EF291B7416BB00D506CC /* PSTCKPaymentCardTextField.m */; }; + 0438EF361B7416BB00D506CC /* PSTCKPaymentCardTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 0438EF291B7416BB00D506CC /* PSTCKPaymentCardTextField.m */; }; + 0438EF371B7416BB00D506CC /* PSTCKPaymentCardTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 0438EF291B7416BB00D506CC /* PSTCKPaymentCardTextField.m */; }; + 0438EF381B7416BB00D506CC /* PSTCKPaymentCardTextFieldViewModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 0438EF2A1B7416BB00D506CC /* PSTCKPaymentCardTextFieldViewModel.h */; }; + 0438EF391B7416BB00D506CC /* PSTCKPaymentCardTextFieldViewModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 0438EF2A1B7416BB00D506CC /* PSTCKPaymentCardTextFieldViewModel.h */; }; + 0438EF3A1B7416BB00D506CC /* PSTCKPaymentCardTextFieldViewModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 0438EF2A1B7416BB00D506CC /* PSTCKPaymentCardTextFieldViewModel.h */; }; + 0438EF3B1B7416BB00D506CC /* PSTCKPaymentCardTextFieldViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 0438EF2B1B7416BB00D506CC /* PSTCKPaymentCardTextFieldViewModel.m */; }; + 0438EF3C1B7416BB00D506CC /* PSTCKPaymentCardTextFieldViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 0438EF2B1B7416BB00D506CC /* PSTCKPaymentCardTextFieldViewModel.m */; }; + 0438EF3D1B7416BB00D506CC /* PSTCKPaymentCardTextFieldViewModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 0438EF2B1B7416BB00D506CC /* PSTCKPaymentCardTextFieldViewModel.m */; }; + 0438EF431B74170D00D506CC /* PSTCKCardValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = 0438EF3F1B74170D00D506CC /* PSTCKCardValidator.m */; }; + 0438EF441B74170D00D506CC /* PSTCKCardValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = 0438EF3F1B74170D00D506CC /* PSTCKCardValidator.m */; }; + 0438EF451B74170D00D506CC /* PSTCKCardValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = 0438EF3F1B74170D00D506CC /* PSTCKCardValidator.m */; }; + 0438EF471B74183100D506CC /* PSTCKCardBrand.h in Headers */ = {isa = PBXBuildFile; fileRef = 0438EF461B74183100D506CC /* PSTCKCardBrand.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0438EF481B74183100D506CC /* PSTCKCardBrand.h in Headers */ = {isa = PBXBuildFile; fileRef = 0438EF461B74183100D506CC /* PSTCKCardBrand.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0438EF491B74183100D506CC /* PSTCKCardBrand.h in Headers */ = {isa = PBXBuildFile; fileRef = 0438EF461B74183100D506CC /* PSTCKCardBrand.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0438EF4C1B741B0100D506CC /* PSTCKCardValidatorTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 0438EF4A1B741B0100D506CC /* PSTCKCardValidatorTest.m */; }; + 0438EF4D1B741B0100D506CC /* PSTCKPaymentCardTextFieldViewModelTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 0438EF4B1B741B0100D506CC /* PSTCKPaymentCardTextFieldViewModelTest.m */; }; + 0438EFA41B741C2800D506CC /* pstck_card_amex.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF891B741C2800D506CC /* pstck_card_amex.png */; }; + 0438EFA51B741C2800D506CC /* pstck_card_amex.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF891B741C2800D506CC /* pstck_card_amex.png */; }; + 0438EFA61B741C2800D506CC /* pstck_card_amex@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF8A1B741C2800D506CC /* pstck_card_amex@2x.png */; }; + 0438EFA71B741C2800D506CC /* pstck_card_amex@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF8A1B741C2800D506CC /* pstck_card_amex@2x.png */; }; + 0438EFA81B741C2800D506CC /* pstck_card_amex@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF8B1B741C2800D506CC /* pstck_card_amex@3x.png */; }; + 0438EFA91B741C2800D506CC /* pstck_card_amex@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF8B1B741C2800D506CC /* pstck_card_amex@3x.png */; }; + 0438EFAA1B741C2800D506CC /* pstck_card_cvc.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF8C1B741C2800D506CC /* pstck_card_cvc.png */; }; + 0438EFAB1B741C2800D506CC /* pstck_card_cvc.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF8C1B741C2800D506CC /* pstck_card_cvc.png */; }; + 0438EFAC1B741C2800D506CC /* pstck_card_cvc@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF8D1B741C2800D506CC /* pstck_card_cvc@2x.png */; }; + 0438EFAD1B741C2800D506CC /* pstck_card_cvc@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF8D1B741C2800D506CC /* pstck_card_cvc@2x.png */; }; + 0438EFAE1B741C2800D506CC /* pstck_card_cvc@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF8E1B741C2800D506CC /* pstck_card_cvc@3x.png */; }; + 0438EFAF1B741C2800D506CC /* pstck_card_cvc@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF8E1B741C2800D506CC /* pstck_card_cvc@3x.png */; }; + 0438EFB01B741C2800D506CC /* pstck_card_cvc_amex.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF8F1B741C2800D506CC /* pstck_card_cvc_amex.png */; }; + 0438EFB11B741C2800D506CC /* pstck_card_cvc_amex.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF8F1B741C2800D506CC /* pstck_card_cvc_amex.png */; }; + 0438EFB21B741C2800D506CC /* pstck_card_cvc_amex@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF901B741C2800D506CC /* pstck_card_cvc_amex@2x.png */; }; + 0438EFB31B741C2800D506CC /* pstck_card_cvc_amex@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF901B741C2800D506CC /* pstck_card_cvc_amex@2x.png */; }; + 0438EFB41B741C2800D506CC /* pstck_card_cvc_amex@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF911B741C2800D506CC /* pstck_card_cvc_amex@3x.png */; }; + 0438EFB51B741C2800D506CC /* pstck_card_cvc_amex@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF911B741C2800D506CC /* pstck_card_cvc_amex@3x.png */; }; + 0438EFB61B741C2800D506CC /* pstck_card_diners.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF921B741C2800D506CC /* pstck_card_diners.png */; }; + 0438EFB71B741C2800D506CC /* pstck_card_diners.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF921B741C2800D506CC /* pstck_card_diners.png */; }; + 0438EFB81B741C2800D506CC /* pstck_card_diners@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF931B741C2800D506CC /* pstck_card_diners@2x.png */; }; + 0438EFB91B741C2800D506CC /* pstck_card_diners@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF931B741C2800D506CC /* pstck_card_diners@2x.png */; }; + 0438EFBA1B741C2800D506CC /* pstck_card_diners@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF941B741C2800D506CC /* pstck_card_diners@3x.png */; }; + 0438EFBB1B741C2800D506CC /* pstck_card_diners@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF941B741C2800D506CC /* pstck_card_diners@3x.png */; }; + 0438EFBC1B741C2800D506CC /* pstck_card_discover.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF951B741C2800D506CC /* pstck_card_discover.png */; }; + 0438EFBD1B741C2800D506CC /* pstck_card_discover.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF951B741C2800D506CC /* pstck_card_discover.png */; }; + 0438EFBE1B741C2800D506CC /* pstck_card_discover@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF961B741C2800D506CC /* pstck_card_discover@2x.png */; }; + 0438EFBF1B741C2800D506CC /* pstck_card_discover@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF961B741C2800D506CC /* pstck_card_discover@2x.png */; }; + 0438EFC01B741C2800D506CC /* pstck_card_discover@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF971B741C2800D506CC /* pstck_card_discover@3x.png */; }; + 0438EFC11B741C2800D506CC /* pstck_card_discover@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF971B741C2800D506CC /* pstck_card_discover@3x.png */; }; + 0438EFC21B741C2800D506CC /* pstck_card_jcb.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF981B741C2800D506CC /* pstck_card_jcb.png */; }; + 0438EFC31B741C2800D506CC /* pstck_card_jcb.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF981B741C2800D506CC /* pstck_card_jcb.png */; }; + 0438EFC41B741C2800D506CC /* pstck_card_jcb@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF991B741C2800D506CC /* pstck_card_jcb@2x.png */; }; + 0438EFC51B741C2800D506CC /* pstck_card_jcb@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF991B741C2800D506CC /* pstck_card_jcb@2x.png */; }; + 0438EFC61B741C2800D506CC /* pstck_card_jcb@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF9A1B741C2800D506CC /* pstck_card_jcb@3x.png */; }; + 0438EFC71B741C2800D506CC /* pstck_card_jcb@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF9A1B741C2800D506CC /* pstck_card_jcb@3x.png */; }; + 0438EFC81B741C2800D506CC /* pstck_card_mastercard.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF9B1B741C2800D506CC /* pstck_card_mastercard.png */; }; + 0438EFC91B741C2800D506CC /* pstck_card_mastercard.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF9B1B741C2800D506CC /* pstck_card_mastercard.png */; }; + 0438EFCA1B741C2800D506CC /* pstck_card_mastercard@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF9C1B741C2800D506CC /* pstck_card_mastercard@2x.png */; }; + 0438EFCB1B741C2800D506CC /* pstck_card_mastercard@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF9C1B741C2800D506CC /* pstck_card_mastercard@2x.png */; }; + 0438EFCC1B741C2800D506CC /* pstck_card_mastercard@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF9D1B741C2800D506CC /* pstck_card_mastercard@3x.png */; }; + 0438EFCD1B741C2800D506CC /* pstck_card_mastercard@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF9D1B741C2800D506CC /* pstck_card_mastercard@3x.png */; }; + 0438EFCE1B741C2800D506CC /* pstck_card_placeholder.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF9E1B741C2800D506CC /* pstck_card_placeholder.png */; }; + 0438EFCF1B741C2800D506CC /* pstck_card_placeholder.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF9E1B741C2800D506CC /* pstck_card_placeholder.png */; }; + 0438EFD01B741C2800D506CC /* pstck_card_placeholder@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF9F1B741C2800D506CC /* pstck_card_placeholder@2x.png */; }; + 0438EFD11B741C2800D506CC /* pstck_card_placeholder@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF9F1B741C2800D506CC /* pstck_card_placeholder@2x.png */; }; + 0438EFD21B741C2800D506CC /* pstck_card_placeholder@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EFA01B741C2800D506CC /* pstck_card_placeholder@3x.png */; }; + 0438EFD31B741C2800D506CC /* pstck_card_placeholder@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EFA01B741C2800D506CC /* pstck_card_placeholder@3x.png */; }; + 0438EFD41B741C2800D506CC /* pstck_card_visa.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EFA11B741C2800D506CC /* pstck_card_visa.png */; }; + 0438EFD51B741C2800D506CC /* pstck_card_visa.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EFA11B741C2800D506CC /* pstck_card_visa.png */; }; + 0438EFD61B741C2800D506CC /* pstck_card_visa@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EFA21B741C2800D506CC /* pstck_card_visa@2x.png */; }; + 0438EFD71B741C2800D506CC /* pstck_card_visa@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EFA21B741C2800D506CC /* pstck_card_visa@2x.png */; }; + 0438EFD81B741C2800D506CC /* pstck_card_visa@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EFA31B741C2800D506CC /* pstck_card_visa@3x.png */; }; + 0438EFD91B741C2800D506CC /* pstck_card_visa@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EFA31B741C2800D506CC /* pstck_card_visa@3x.png */; }; + 0438EFDB1B7524AA00D506CC /* PSTCKCardBrand.h in Headers */ = {isa = PBXBuildFile; fileRef = 0438EF461B74183100D506CC /* PSTCKCardBrand.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04415C611A6605B5001225ED /* PSTCKFormEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB4C51A5F30A700B854EE /* PSTCKFormEncoder.m */; }; + 04415C641A6605B5001225ED /* PSTCKCard.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB4CB1A5F30A700B854EE /* PSTCKCard.m */; }; + 04415C651A6605B5001225ED /* PSTCKToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB4CD1A5F30A700B854EE /* PSTCKToken.m */; }; + 04415C661A6605B5001225ED /* PaystackError.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB4CF1A5F30A700B854EE /* PaystackError.m */; }; + 04415C671A6605B5001225ED /* PSTCKAPIClientTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB51E1A5F3A9300B854EE /* PSTCKAPIClientTest.m */; }; + 04415C681A6605B5001225ED /* PSTCKFormEncoderTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB51F1A5F3A9300B854EE /* PSTCKFormEncoderTest.m */; }; + 04415C6D1A6605B5001225ED /* PSTCKCardFunctionalTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB5241A5F3A9300B854EE /* PSTCKCardFunctionalTest.m */; }; + 04415C6E1A6605B5001225ED /* PSTCKCardTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB5251A5F3A9300B854EE /* PSTCKCardTest.m */; }; + 04415C6F1A6605B5001225ED /* PSTCKCertTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB5261A5F3A9300B854EE /* PSTCKCertTest.m */; }; + 04415C701A6605B5001225ED /* PSTCKTokenTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB5271A5F3A9300B854EE /* PSTCKTokenTest.m */; }; + 04415C721A6605D9001225ED /* Paystack.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDB4A91A5F30A700B854EE /* Paystack.h */; }; + 04415C7F1A6605D9001225ED /* PSTCKAPIClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDB4C21A5F30A700B854EE /* PSTCKAPIClient.h */; }; + 04415C801A6605D9001225ED /* PSTCKFormEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDB4C41A5F30A700B854EE /* PSTCKFormEncoder.h */; }; + 04415C831A6605D9001225ED /* PSTCKCard.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDB4CA1A5F30A700B854EE /* PSTCKCard.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04415C841A6605D9001225ED /* PSTCKToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDB4CC1A5F30A700B854EE /* PSTCKToken.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04415C851A6605D9001225ED /* PaystackError.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDB4CE1A5F30A700B854EE /* PaystackError.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04533E7D1A6877F400C7E52E /* PassKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 04D5BF9019BF958F009521A5 /* PassKit.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + 045A62AB1B8E7259000165CE /* PSTCKPaymentCardTextFieldTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 045A62AA1B8E7259000165CE /* PSTCKPaymentCardTextFieldTest.m */; }; + 045A62AC1B8E73AB000165CE /* pstck_card_amex.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF891B741C2800D506CC /* pstck_card_amex.png */; }; + 045A62AD1B8E73AB000165CE /* pstck_card_amex@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF8A1B741C2800D506CC /* pstck_card_amex@2x.png */; }; + 045A62AE1B8E73AB000165CE /* pstck_card_amex@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF8B1B741C2800D506CC /* pstck_card_amex@3x.png */; }; + 045A62AF1B8E73AB000165CE /* pstck_card_cvc.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF8C1B741C2800D506CC /* pstck_card_cvc.png */; }; + 045A62B01B8E73AB000165CE /* pstck_card_cvc@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF8D1B741C2800D506CC /* pstck_card_cvc@2x.png */; }; + 045A62B11B8E73AB000165CE /* pstck_card_cvc@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF8E1B741C2800D506CC /* pstck_card_cvc@3x.png */; }; + 045A62B21B8E73AB000165CE /* pstck_card_cvc_amex.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF8F1B741C2800D506CC /* pstck_card_cvc_amex.png */; }; + 045A62B31B8E73AB000165CE /* pstck_card_cvc_amex@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF901B741C2800D506CC /* pstck_card_cvc_amex@2x.png */; }; + 045A62B41B8E73AB000165CE /* pstck_card_cvc_amex@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF911B741C2800D506CC /* pstck_card_cvc_amex@3x.png */; }; + 045A62B51B8E73AB000165CE /* pstck_card_diners.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF921B741C2800D506CC /* pstck_card_diners.png */; }; + 045A62B61B8E73AB000165CE /* pstck_card_diners@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF931B741C2800D506CC /* pstck_card_diners@2x.png */; }; + 045A62B71B8E73AB000165CE /* pstck_card_diners@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF941B741C2800D506CC /* pstck_card_diners@3x.png */; }; + 045A62B81B8E73AB000165CE /* pstck_card_discover.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF951B741C2800D506CC /* pstck_card_discover.png */; }; + 045A62B91B8E73AB000165CE /* pstck_card_discover@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF961B741C2800D506CC /* pstck_card_discover@2x.png */; }; + 045A62BA1B8E73AB000165CE /* pstck_card_discover@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF971B741C2800D506CC /* pstck_card_discover@3x.png */; }; + 045A62BB1B8E73AB000165CE /* pstck_card_jcb.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF981B741C2800D506CC /* pstck_card_jcb.png */; }; + 045A62BC1B8E73AB000165CE /* pstck_card_jcb@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF991B741C2800D506CC /* pstck_card_jcb@2x.png */; }; + 045A62BD1B8E73AB000165CE /* pstck_card_jcb@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF9A1B741C2800D506CC /* pstck_card_jcb@3x.png */; }; + 045A62BE1B8E73AB000165CE /* pstck_card_mastercard.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF9B1B741C2800D506CC /* pstck_card_mastercard.png */; }; + 045A62BF1B8E73AB000165CE /* pstck_card_mastercard@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF9C1B741C2800D506CC /* pstck_card_mastercard@2x.png */; }; + 045A62C01B8E73AB000165CE /* pstck_card_mastercard@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF9D1B741C2800D506CC /* pstck_card_mastercard@3x.png */; }; + 045A62C11B8E73AB000165CE /* pstck_card_placeholder.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF9E1B741C2800D506CC /* pstck_card_placeholder.png */; }; + 045A62C21B8E73AB000165CE /* pstck_card_placeholder@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EF9F1B741C2800D506CC /* pstck_card_placeholder@2x.png */; }; + 045A62C31B8E73AB000165CE /* pstck_card_placeholder@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EFA01B741C2800D506CC /* pstck_card_placeholder@3x.png */; }; + 045A62C41B8E73AB000165CE /* pstck_card_placeholder_template.png in Resources */ = {isa = PBXBuildFile; fileRef = 042CA1B31B7BD84100AF0DA6 /* pstck_card_placeholder_template.png */; }; + 045A62C51B8E73AB000165CE /* pstck_card_placeholder_template@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 042CA1B41B7BD84100AF0DA6 /* pstck_card_placeholder_template@2x.png */; }; + 045A62C61B8E73AB000165CE /* pstck_card_placeholder_template@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 042CA1B51B7BD84100AF0DA6 /* pstck_card_placeholder_template@3x.png */; }; + 045A62C71B8E73AB000165CE /* pstck_card_visa.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EFA11B741C2800D506CC /* pstck_card_visa.png */; }; + 045A62C81B8E73AB000165CE /* pstck_card_visa@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EFA21B741C2800D506CC /* pstck_card_visa@2x.png */; }; + 045A62C91B8E73AB000165CE /* pstck_card_visa@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 0438EFA31B741C2800D506CC /* pstck_card_visa@3x.png */; }; + 049952CF1BCF13510088C703 /* PSTCKAPIPostRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 049952CD1BCF13510088C703 /* PSTCKAPIPostRequest.h */; }; + 049952D01BCF13510088C703 /* PSTCKAPIPostRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 049952CE1BCF13510088C703 /* PSTCKAPIPostRequest.m */; }; + 049952D21BCF13DD0088C703 /* PSTCKAPIClient+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 049952D11BCF13DD0088C703 /* PSTCKAPIClient+Private.h */; }; + 049952D31BCF13DD0088C703 /* PSTCKAPIClient+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 049952D11BCF13DD0088C703 /* PSTCKAPIClient+Private.h */; }; + 049952D41BCF13DD0088C703 /* PSTCKAPIClient+Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 049952D11BCF13DD0088C703 /* PSTCKAPIClient+Private.h */; }; + 049952D51BCF14920088C703 /* PSTCKAPIPostRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 049952CD1BCF13510088C703 /* PSTCKAPIPostRequest.h */; }; + 049952D61BCF14930088C703 /* PSTCKAPIPostRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 049952CD1BCF13510088C703 /* PSTCKAPIPostRequest.h */; }; + 049952D71BCF14980088C703 /* PSTCKAPIPostRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 049952CE1BCF13510088C703 /* PSTCKAPIPostRequest.m */; }; + 049952D81BCF14990088C703 /* PSTCKAPIPostRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 049952CE1BCF13510088C703 /* PSTCKAPIPostRequest.m */; }; + 049E84CC1A605DE0000B66CD /* PSTCKAPIClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB4C31A5F30A700B854EE /* PSTCKAPIClient.m */; }; + 049E84CD1A605DE0000B66CD /* PSTCKFormEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB4C51A5F30A700B854EE /* PSTCKFormEncoder.m */; }; + 049E84D01A605DE0000B66CD /* PSTCKCard.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB4CB1A5F30A700B854EE /* PSTCKCard.m */; }; + 049E84D11A605DE0000B66CD /* PSTCKToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB4CD1A5F30A700B854EE /* PSTCKToken.m */; }; + 049E84D21A605DE0000B66CD /* PaystackError.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB4CF1A5F30A700B854EE /* PaystackError.m */; }; + 049E84D31A605E6A000B66CD /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FAFC12C516E5767F0066297F /* UIKit.framework */; }; + 049E84D41A605E7C000B66CD /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 11C74B9B164043050071C2CA /* Foundation.framework */; }; + 049E84D51A605E82000B66CD /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4A0D74F918F6106100966D7B /* Security.framework */; }; + 049E84D61A605E8F000B66CD /* PassKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 04D5BF9019BF958F009521A5 /* PassKit.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; + 049E84D71A605E99000B66CD /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 04B94BC71A47B78A00092C46 /* AddressBook.framework */; }; + 049E84D91A605EF0000B66CD /* Paystack.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDB4A91A5F30A700B854EE /* Paystack.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 049E84E61A605EF0000B66CD /* PSTCKAPIClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDB4C21A5F30A700B854EE /* PSTCKAPIClient.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 049E84E71A605EF0000B66CD /* PSTCKFormEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDB4C41A5F30A700B854EE /* PSTCKFormEncoder.h */; }; + 049E84EA1A605EF0000B66CD /* PSTCKCard.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDB4CA1A5F30A700B854EE /* PSTCKCard.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 049E84EB1A605EF0000B66CD /* PSTCKToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDB4CC1A5F30A700B854EE /* PSTCKToken.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 049E84EC1A605EF0000B66CD /* PaystackError.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDB4CE1A5F30A700B854EE /* PaystackError.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04B33F361BC7488D00DD8120 /* Info.plist in Copy Files */ = {isa = PBXBuildFile; fileRef = 04B33F301BC7417B00DD8120 /* Info.plist */; }; + 04CDB4D31A5F30A700B854EE /* Paystack.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDB4A91A5F30A700B854EE /* Paystack.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04CDB4FE1A5F30A700B854EE /* PSTCKAPIClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDB4C21A5F30A700B854EE /* PSTCKAPIClient.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04CDB5001A5F30A700B854EE /* PSTCKAPIClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB4C31A5F30A700B854EE /* PSTCKAPIClient.m */; }; + 04CDB5021A5F30A700B854EE /* PSTCKFormEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDB4C41A5F30A700B854EE /* PSTCKFormEncoder.h */; }; + 04CDB5041A5F30A700B854EE /* PSTCKFormEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB4C51A5F30A700B854EE /* PSTCKFormEncoder.m */; }; + 04CDB50E1A5F30A700B854EE /* PSTCKCard.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDB4CA1A5F30A700B854EE /* PSTCKCard.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04CDB5101A5F30A700B854EE /* PSTCKCard.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB4CB1A5F30A700B854EE /* PSTCKCard.m */; }; + 04CDB5121A5F30A700B854EE /* PSTCKToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDB4CC1A5F30A700B854EE /* PSTCKToken.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04CDB5141A5F30A700B854EE /* PSTCKToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB4CD1A5F30A700B854EE /* PSTCKToken.m */; }; + 04CDB5161A5F30A700B854EE /* PaystackError.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDB4CE1A5F30A700B854EE /* PaystackError.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04CDB5181A5F30A700B854EE /* PaystackError.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB4CF1A5F30A700B854EE /* PaystackError.m */; }; + 04CDE5B81BC1F1F100548833 /* PSTCKCardParams.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDE5B41BC1F1F100548833 /* PSTCKCardParams.m */; }; + 04CDE5B91BC1F1F100548833 /* PSTCKCardParams.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDE5B41BC1F1F100548833 /* PSTCKCardParams.m */; }; + 04CDE5BA1BC1F1F100548833 /* PSTCKCardParams.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDE5B41BC1F1F100548833 /* PSTCKCardParams.m */; }; + 04CDE5BD1BC1F21500548833 /* PSTCKCardParams.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDE5BB1BC1F21500548833 /* PSTCKCardParams.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04CDE5BE1BC1F21500548833 /* PSTCKCardParams.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDE5BB1BC1F21500548833 /* PSTCKCardParams.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04CDE5BF1BC1FD4500548833 /* PSTCKCardParams.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDE5BB1BC1F21500548833 /* PSTCKCardParams.h */; }; + 04D12C111A5F556D0010446E /* PaystackOSX.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 04D12C061A5F556D0010446E /* PaystackOSX.framework */; }; + 04D12C251A5F55AD0010446E /* PSTCKAPIClient.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB4C31A5F30A700B854EE /* PSTCKAPIClient.m */; }; + 04D12C261A5F55AD0010446E /* PSTCKFormEncoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB4C51A5F30A700B854EE /* PSTCKFormEncoder.m */; }; + 04D12C291A5F55AD0010446E /* PSTCKCard.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB4CB1A5F30A700B854EE /* PSTCKCard.m */; }; + 04D12C2A1A5F55AD0010446E /* PSTCKToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB4CD1A5F30A700B854EE /* PSTCKToken.m */; }; + 04D12C2B1A5F55AD0010446E /* PaystackError.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB4CF1A5F30A700B854EE /* PaystackError.m */; }; + 04D12C2C1A5F55D10010446E /* Paystack.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDB4A91A5F30A700B854EE /* Paystack.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04D12C391A5F55D10010446E /* PSTCKAPIClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDB4C21A5F30A700B854EE /* PSTCKAPIClient.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04D12C3A1A5F55D10010446E /* PSTCKFormEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDB4C41A5F30A700B854EE /* PSTCKFormEncoder.h */; }; + 04D12C3D1A5F55D10010446E /* PSTCKCard.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDB4CA1A5F30A700B854EE /* PSTCKCard.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04D12C3E1A5F55D10010446E /* PSTCKToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDB4CC1A5F30A700B854EE /* PSTCKToken.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04D12C3F1A5F55D10010446E /* PaystackError.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDB4CE1A5F30A700B854EE /* PaystackError.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04D12C401A5F55FA0010446E /* PSTCKAPIClientTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB51E1A5F3A9300B854EE /* PSTCKAPIClientTest.m */; }; + 04D12C411A5F55FA0010446E /* PSTCKFormEncoderTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB51F1A5F3A9300B854EE /* PSTCKFormEncoderTest.m */; }; + 04D12C451A5F55FA0010446E /* PSTCKCardFunctionalTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB5241A5F3A9300B854EE /* PSTCKCardFunctionalTest.m */; }; + 04D12C461A5F55FA0010446E /* PSTCKCardTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB5251A5F3A9300B854EE /* PSTCKCardTest.m */; }; + 04D12C471A5F55FA0010446E /* PSTCKCertTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB5261A5F3A9300B854EE /* PSTCKCertTest.m */; }; + 04D12C481A5F55FA0010446E /* PSTCKTokenTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 04CDB5271A5F3A9300B854EE /* PSTCKTokenTest.m */; }; + 04E32A9B1B7A93FC009C9E35 /* PSTCKCardValidator.m in Sources */ = {isa = PBXBuildFile; fileRef = 0438EF3F1B74170D00D506CC /* PSTCKCardValidator.m */; }; + 04E32A9D1B7A9490009C9E35 /* PSTCKPaymentCardTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = 04E32A9C1B7A9490009C9E35 /* PSTCKPaymentCardTextField.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04E32A9E1B7A9490009C9E35 /* PSTCKPaymentCardTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = 04E32A9C1B7A9490009C9E35 /* PSTCKPaymentCardTextField.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04E32AA01B7A9490009C9E35 /* PSTCKPaymentCardTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = 04E32A9C1B7A9490009C9E35 /* PSTCKPaymentCardTextField.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04EBC7531B7533C300A0E6AE /* PSTCKCardValidationState.h in Headers */ = {isa = PBXBuildFile; fileRef = 04EBC7511B7533C300A0E6AE /* PSTCKCardValidationState.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04EBC7541B7533C300A0E6AE /* PSTCKCardValidationState.h in Headers */ = {isa = PBXBuildFile; fileRef = 04EBC7511B7533C300A0E6AE /* PSTCKCardValidationState.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04EBC7551B7533C300A0E6AE /* PSTCKCardValidationState.h in Headers */ = {isa = PBXBuildFile; fileRef = 04EBC7511B7533C300A0E6AE /* PSTCKCardValidationState.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04EBC7561B7533C300A0E6AE /* PSTCKCardValidationState.h in Headers */ = {isa = PBXBuildFile; fileRef = 04EBC7511B7533C300A0E6AE /* PSTCKCardValidationState.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04EBC7571B7533C300A0E6AE /* PSTCKCardValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = 04EBC7521B7533C300A0E6AE /* PSTCKCardValidator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04EBC7581B7533C300A0E6AE /* PSTCKCardValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = 04EBC7521B7533C300A0E6AE /* PSTCKCardValidator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04EBC7591B7533C300A0E6AE /* PSTCKCardValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = 04EBC7521B7533C300A0E6AE /* PSTCKCardValidator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04EBC75A1B7533C300A0E6AE /* PSTCKCardValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = 04EBC7521B7533C300A0E6AE /* PSTCKCardValidator.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04F213311BCEAB61001D6F22 /* PSTCKFormEncodable.h in Headers */ = {isa = PBXBuildFile; fileRef = 04F213301BCEAB61001D6F22 /* PSTCKFormEncodable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04F213321BCEAB61001D6F22 /* PSTCKFormEncodable.h in Headers */ = {isa = PBXBuildFile; fileRef = 04F213301BCEAB61001D6F22 /* PSTCKFormEncodable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04F213331BCEAB61001D6F22 /* PSTCKFormEncodable.h in Headers */ = {isa = PBXBuildFile; fileRef = 04F213301BCEAB61001D6F22 /* PSTCKFormEncodable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04F213351BCECB1C001D6F22 /* PSTCKAPIResponseDecodable.h in Headers */ = {isa = PBXBuildFile; fileRef = 04F213341BCECB1C001D6F22 /* PSTCKAPIResponseDecodable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04F213361BCECB1C001D6F22 /* PSTCKAPIResponseDecodable.h in Headers */ = {isa = PBXBuildFile; fileRef = 04F213341BCECB1C001D6F22 /* PSTCKAPIResponseDecodable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04F213371BCECB1C001D6F22 /* PSTCKAPIResponseDecodable.h in Headers */ = {isa = PBXBuildFile; fileRef = 04F213341BCECB1C001D6F22 /* PSTCKAPIResponseDecodable.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 04FCFA191BD59A8C00297732 /* PSTCKCategoryLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 04FCFA171BD59A8C00297732 /* PSTCKCategoryLoader.h */; }; + 04FCFA1A1BD59A8C00297732 /* PSTCKCategoryLoader.m in Sources */ = {isa = PBXBuildFile; fileRef = 04FCFA181BD59A8C00297732 /* PSTCKCategoryLoader.m */; }; + 10500AB21C8135D800EEF7CF /* PSTCKRSA.m in Sources */ = {isa = PBXBuildFile; fileRef = 10500AB11C8135D800EEF7CF /* PSTCKRSA.m */; }; + 10500AB51C8136EF00EEF7CF /* PSTCKRSATest.m in Sources */ = {isa = PBXBuildFile; fileRef = 10500AB41C8136EF00EEF7CF /* PSTCKRSATest.m */; }; + 10500ABB1C82155B00EEF7CF /* PSTCKRSA.h in Headers */ = {isa = PBXBuildFile; fileRef = 10500AB31C8135F800EEF7CF /* PSTCKRSA.h */; }; + 10500ABC1C82157A00EEF7CF /* PSTCKRSA.m in Sources */ = {isa = PBXBuildFile; fileRef = 10500AB11C8135D800EEF7CF /* PSTCKRSA.m */; }; + 10500ABD1C8215F400EEF7CF /* PSTCKRSA.h in Headers */ = {isa = PBXBuildFile; fileRef = 10500AB31C8135F800EEF7CF /* PSTCKRSA.h */; }; + 10500ABE1C8216C200EEF7CF /* PSTCKRSA.h in Headers */ = {isa = PBXBuildFile; fileRef = 10500AB31C8135F800EEF7CF /* PSTCKRSA.h */; }; + 10A653A31C88CC5900EBC974 /* PSTCKCardParams.h in Headers */ = {isa = PBXBuildFile; fileRef = 04CDE5BB1BC1F21500548833 /* PSTCKCardParams.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 10FC52071C88DDB3004A0733 /* PSTCKRSA.h in Headers */ = {isa = PBXBuildFile; fileRef = 10500AB31C8135F800EEF7CF /* PSTCKRSA.h */; }; + C1718D561C3B2E5B002A7CB3 /* UIImage+Paystack.h in Headers */ = {isa = PBXBuildFile; fileRef = C1718D541C3B2E5B002A7CB3 /* UIImage+Paystack.h */; }; + C1718D571C3B2E5B002A7CB3 /* UIImage+Paystack.m in Sources */ = {isa = PBXBuildFile; fileRef = C1718D551C3B2E5B002A7CB3 /* UIImage+Paystack.m */; }; + C1718D581C3B2E60002A7CB3 /* UIImage+Paystack.h in Headers */ = {isa = PBXBuildFile; fileRef = C1718D541C3B2E5B002A7CB3 /* UIImage+Paystack.h */; }; + C178CD451C45607D00851C69 /* UIImage+PaystackTest.m in Sources */ = {isa = PBXBuildFile; fileRef = C178CD441C45607D00851C69 /* UIImage+PaystackTest.m */; }; + C181DD721C3B34E300DEB9FE /* UIImage+Paystack.m in Sources */ = {isa = PBXBuildFile; fileRef = C1718D551C3B2E5B002A7CB3 /* UIImage+Paystack.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 045E7C0A1A5F41DE004751EF /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 11C74B8F164043050071C2CA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 04CDB4411A5F2E1800B854EE; + remoteInfo = PaystackiOS; + }; + 049E85261A608027000B66CD /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 11C74B8F164043050071C2CA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 049E84AA1A605D93000B66CD; + remoteInfo = PaystackiOSStatic; + }; + 04D12C121A5F556D0010446E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 11C74B8F164043050071C2CA /* Project object */; + proxyType = 1; + remoteGlobalIDString = 04D12C051A5F556D0010446E; + remoteInfo = PaystackOSX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 049E84A91A605D93000B66CD /* Copy Files */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = "include/$(PRODUCT_NAME)"; + dstSubfolderSpec = 16; + files = ( + ); + name = "Copy Files"; + runOnlyForDeploymentPostprocessing = 0; + }; + 04B33F321BC744D100DD8120 /* Copy Files */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = Paystack.framework; + dstSubfolderSpec = 16; + files = ( + 04B33F361BC7488D00DD8120 /* Info.plist in Copy Files */, + ); + name = "Copy Files"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 0401C6E61BA8E3C300CE8A6D /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; name = module.modulemap; path = Paystack/module.modulemap; sourceTree = SOURCE_ROOT; }; + 042CA1B31B7BD84100AF0DA6 /* pstck_card_placeholder_template.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pstck_card_placeholder_template.png; sourceTree = ""; }; + 042CA1B41B7BD84100AF0DA6 /* pstck_card_placeholder_template@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pstck_card_placeholder_template@2x.png"; sourceTree = ""; }; + 042CA1B51B7BD84100AF0DA6 /* pstck_card_placeholder_template@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pstck_card_placeholder_template@3x.png"; sourceTree = ""; }; + 0433EB471BD06313003912B4 /* NSDictionary+Paystack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSDictionary+Paystack.h"; sourceTree = ""; }; + 0433EB481BD06313003912B4 /* NSDictionary+Paystack.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSDictionary+Paystack.m"; sourceTree = ""; }; + 04365D2C1A4CF86C00A3E1D4 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + 0438EF261B7416BB00D506CC /* PSTCKFormTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PSTCKFormTextField.h; path = UI/PSTCKFormTextField.h; sourceTree = ""; }; + 0438EF271B7416BB00D506CC /* PSTCKFormTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PSTCKFormTextField.m; path = UI/PSTCKFormTextField.m; sourceTree = ""; }; + 0438EF291B7416BB00D506CC /* PSTCKPaymentCardTextField.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PSTCKPaymentCardTextField.m; path = UI/PSTCKPaymentCardTextField.m; sourceTree = ""; }; + 0438EF2A1B7416BB00D506CC /* PSTCKPaymentCardTextFieldViewModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PSTCKPaymentCardTextFieldViewModel.h; path = UI/PSTCKPaymentCardTextFieldViewModel.h; sourceTree = ""; }; + 0438EF2B1B7416BB00D506CC /* PSTCKPaymentCardTextFieldViewModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PSTCKPaymentCardTextFieldViewModel.m; path = UI/PSTCKPaymentCardTextFieldViewModel.m; sourceTree = ""; }; + 0438EF3F1B74170D00D506CC /* PSTCKCardValidator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSTCKCardValidator.m; sourceTree = ""; }; + 0438EF461B74183100D506CC /* PSTCKCardBrand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PSTCKCardBrand.h; path = PublicHeaders/PSTCKCardBrand.h; sourceTree = ""; }; + 0438EF4A1B741B0100D506CC /* PSTCKCardValidatorTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSTCKCardValidatorTest.m; sourceTree = ""; }; + 0438EF4B1B741B0100D506CC /* PSTCKPaymentCardTextFieldViewModelTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSTCKPaymentCardTextFieldViewModelTest.m; sourceTree = ""; }; + 0438EF891B741C2800D506CC /* pstck_card_amex.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pstck_card_amex.png; sourceTree = ""; }; + 0438EF8A1B741C2800D506CC /* pstck_card_amex@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pstck_card_amex@2x.png"; sourceTree = ""; }; + 0438EF8B1B741C2800D506CC /* pstck_card_amex@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pstck_card_amex@3x.png"; sourceTree = ""; }; + 0438EF8C1B741C2800D506CC /* pstck_card_cvc.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pstck_card_cvc.png; sourceTree = ""; }; + 0438EF8D1B741C2800D506CC /* pstck_card_cvc@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pstck_card_cvc@2x.png"; sourceTree = ""; }; + 0438EF8E1B741C2800D506CC /* pstck_card_cvc@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pstck_card_cvc@3x.png"; sourceTree = ""; }; + 0438EF8F1B741C2800D506CC /* pstck_card_cvc_amex.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pstck_card_cvc_amex.png; sourceTree = ""; }; + 0438EF901B741C2800D506CC /* pstck_card_cvc_amex@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pstck_card_cvc_amex@2x.png"; sourceTree = ""; }; + 0438EF911B741C2800D506CC /* pstck_card_cvc_amex@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pstck_card_cvc_amex@3x.png"; sourceTree = ""; }; + 0438EF921B741C2800D506CC /* pstck_card_diners.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pstck_card_diners.png; sourceTree = ""; }; + 0438EF931B741C2800D506CC /* pstck_card_diners@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pstck_card_diners@2x.png"; sourceTree = ""; }; + 0438EF941B741C2800D506CC /* pstck_card_diners@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pstck_card_diners@3x.png"; sourceTree = ""; }; + 0438EF951B741C2800D506CC /* pstck_card_discover.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pstck_card_discover.png; sourceTree = ""; }; + 0438EF961B741C2800D506CC /* pstck_card_discover@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pstck_card_discover@2x.png"; sourceTree = ""; }; + 0438EF971B741C2800D506CC /* pstck_card_discover@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pstck_card_discover@3x.png"; sourceTree = ""; }; + 0438EF981B741C2800D506CC /* pstck_card_jcb.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pstck_card_jcb.png; sourceTree = ""; }; + 0438EF991B741C2800D506CC /* pstck_card_jcb@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pstck_card_jcb@2x.png"; sourceTree = ""; }; + 0438EF9A1B741C2800D506CC /* pstck_card_jcb@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pstck_card_jcb@3x.png"; sourceTree = ""; }; + 0438EF9B1B741C2800D506CC /* pstck_card_mastercard.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pstck_card_mastercard.png; sourceTree = ""; }; + 0438EF9C1B741C2800D506CC /* pstck_card_mastercard@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pstck_card_mastercard@2x.png"; sourceTree = ""; }; + 0438EF9D1B741C2800D506CC /* pstck_card_mastercard@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pstck_card_mastercard@3x.png"; sourceTree = ""; }; + 0438EF9E1B741C2800D506CC /* pstck_card_placeholder.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pstck_card_placeholder.png; sourceTree = ""; }; + 0438EF9F1B741C2800D506CC /* pstck_card_placeholder@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pstck_card_placeholder@2x.png"; sourceTree = ""; }; + 0438EFA01B741C2800D506CC /* pstck_card_placeholder@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pstck_card_placeholder@3x.png"; sourceTree = ""; }; + 0438EFA11B741C2800D506CC /* pstck_card_visa.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = pstck_card_visa.png; sourceTree = ""; }; + 0438EFA21B741C2800D506CC /* pstck_card_visa@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pstck_card_visa@2x.png"; sourceTree = ""; }; + 0438EFA31B741C2800D506CC /* pstck_card_visa@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "pstck_card_visa@3x.png"; sourceTree = ""; }; + 045A62AA1B8E7259000165CE /* PSTCKPaymentCardTextFieldTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSTCKPaymentCardTextFieldTest.m; sourceTree = ""; }; + 045E7C031A5F41DE004751EF /* PaystackiOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "PaystackiOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + 049952CD1BCF13510088C703 /* PSTCKAPIPostRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PSTCKAPIPostRequest.h; sourceTree = ""; }; + 049952CE1BCF13510088C703 /* PSTCKAPIPostRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSTCKAPIPostRequest.m; sourceTree = ""; }; + 049952D11BCF13DD0088C703 /* PSTCKAPIClient+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "PSTCKAPIClient+Private.h"; sourceTree = ""; }; + 049E84AB1A605D93000B66CD /* libPaystack.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPaystack.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 04A58A461BC603BB004E7BC2 /* FABKitProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FABKitProtocol.h; sourceTree = ""; }; + 04A58A471BC603BB004E7BC2 /* Fabric+FABKits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "Fabric+FABKits.h"; sourceTree = ""; }; + 04A58A481BC603BB004E7BC2 /* Fabric.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Fabric.h; sourceTree = ""; }; + 04B33F301BC7417B00DD8120 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 04B94BC71A47B78A00092C46 /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; }; + 04CDB4421A5F2E1800B854EE /* Paystack.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Paystack.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 04CDB4A91A5F30A700B854EE /* Paystack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Paystack.h; path = PublicHeaders/Paystack.h; sourceTree = ""; }; + 04CDB4C21A5F30A700B854EE /* PSTCKAPIClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = PSTCKAPIClient.h; path = PublicHeaders/PSTCKAPIClient.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; + 04CDB4C31A5F30A700B854EE /* PSTCKAPIClient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSTCKAPIClient.m; sourceTree = ""; }; + 04CDB4C41A5F30A700B854EE /* PSTCKFormEncoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PSTCKFormEncoder.h; sourceTree = ""; }; + 04CDB4C51A5F30A700B854EE /* PSTCKFormEncoder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSTCKFormEncoder.m; sourceTree = ""; }; + 04CDB4CA1A5F30A700B854EE /* PSTCKCard.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PSTCKCard.h; path = PublicHeaders/PSTCKCard.h; sourceTree = ""; }; + 04CDB4CB1A5F30A700B854EE /* PSTCKCard.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSTCKCard.m; sourceTree = ""; }; + 04CDB4CC1A5F30A700B854EE /* PSTCKToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PSTCKToken.h; path = PublicHeaders/PSTCKToken.h; sourceTree = ""; }; + 04CDB4CD1A5F30A700B854EE /* PSTCKToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSTCKToken.m; sourceTree = ""; }; + 04CDB4CE1A5F30A700B854EE /* PaystackError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PaystackError.h; path = PublicHeaders/PaystackError.h; sourceTree = ""; }; + 04CDB4CF1A5F30A700B854EE /* PaystackError.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PaystackError.m; sourceTree = ""; }; + 04CDB51E1A5F3A9300B854EE /* PSTCKAPIClientTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSTCKAPIClientTest.m; sourceTree = ""; }; + 04CDB51F1A5F3A9300B854EE /* PSTCKFormEncoderTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSTCKFormEncoderTest.m; sourceTree = ""; }; + 04CDB5241A5F3A9300B854EE /* PSTCKCardFunctionalTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSTCKCardFunctionalTest.m; sourceTree = ""; }; + 04CDB5251A5F3A9300B854EE /* PSTCKCardTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSTCKCardTest.m; sourceTree = ""; }; + 04CDB5261A5F3A9300B854EE /* PSTCKCertTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSTCKCertTest.m; sourceTree = ""; }; + 04CDB5271A5F3A9300B854EE /* PSTCKTokenTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSTCKTokenTest.m; sourceTree = ""; }; + 04CDE5B41BC1F1F100548833 /* PSTCKCardParams.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSTCKCardParams.m; sourceTree = ""; }; + 04CDE5BB1BC1F21500548833 /* PSTCKCardParams.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PSTCKCardParams.h; path = PublicHeaders/PSTCKCardParams.h; sourceTree = ""; }; + 04D12C061A5F556D0010446E /* PaystackOSX.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PaystackOSX.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 04D12C101A5F556D0010446E /* PaystackOSXTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PaystackOSXTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 04D5BF9019BF958F009521A5 /* PassKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PassKit.framework; path = System/Library/Frameworks/PassKit.framework; sourceTree = SDKROOT; }; + 04E32A9C1B7A9490009C9E35 /* PSTCKPaymentCardTextField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PSTCKPaymentCardTextField.h; path = PublicHeaders/UI/PSTCKPaymentCardTextField.h; sourceTree = ""; }; + 04EBC7511B7533C300A0E6AE /* PSTCKCardValidationState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PSTCKCardValidationState.h; path = PublicHeaders/PSTCKCardValidationState.h; sourceTree = ""; }; + 04EBC7521B7533C300A0E6AE /* PSTCKCardValidator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PSTCKCardValidator.h; path = PublicHeaders/PSTCKCardValidator.h; sourceTree = ""; }; + 04F213301BCEAB61001D6F22 /* PSTCKFormEncodable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PSTCKFormEncodable.h; path = PublicHeaders/PSTCKFormEncodable.h; sourceTree = ""; }; + 04F213341BCECB1C001D6F22 /* PSTCKAPIResponseDecodable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PSTCKAPIResponseDecodable.h; path = PublicHeaders/PSTCKAPIResponseDecodable.h; sourceTree = ""; }; + 04F39F0A1AEF2AFE005B926E /* Project-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Project-Debug.xcconfig"; sourceTree = ""; }; + 04F39F0B1AEF2AFE005B926E /* Project-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Project-Release.xcconfig"; sourceTree = ""; }; + 04F39F0C1AEF2AFE005B926E /* Project-Shared.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Project-Shared.xcconfig"; sourceTree = ""; }; + 04F39F0D1AEF2AFE005B926E /* PaystackiOS Tests-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "PaystackiOS Tests-Debug.xcconfig"; sourceTree = ""; }; + 04F39F0E1AEF2AFE005B926E /* PaystackiOS Tests-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "PaystackiOS Tests-Release.xcconfig"; sourceTree = ""; }; + 04F39F0F1AEF2AFE005B926E /* PaystackiOS Tests-Shared.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "PaystackiOS Tests-Shared.xcconfig"; sourceTree = ""; }; + 04F39F101AEF2AFE005B926E /* PaystackiOS-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "PaystackiOS-Debug.xcconfig"; sourceTree = ""; }; + 04F39F111AEF2AFE005B926E /* PaystackiOS-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "PaystackiOS-Release.xcconfig"; sourceTree = ""; }; + 04F39F121AEF2AFE005B926E /* PaystackiOS-Shared.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "PaystackiOS-Shared.xcconfig"; sourceTree = ""; }; + 04F39F151AEF2AFE005B926E /* PaystackiOSStatic.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = PaystackiOSStatic.xcconfig; sourceTree = ""; }; + 04F39F181AEF2AFE005B926E /* PaystackiOSStaticFramework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = PaystackiOSStaticFramework.xcconfig; sourceTree = ""; }; + 04F39F1F1AEF2AFE005B926E /* PaystackOSX-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "PaystackOSX-Debug.xcconfig"; sourceTree = ""; }; + 04F39F201AEF2AFE005B926E /* PaystackOSX-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "PaystackOSX-Release.xcconfig"; sourceTree = ""; }; + 04F39F211AEF2AFE005B926E /* PaystackOSX-Shared.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "PaystackOSX-Shared.xcconfig"; sourceTree = ""; }; + 04F39F221AEF2AFE005B926E /* PaystackOSXTests-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "PaystackOSXTests-Debug.xcconfig"; sourceTree = ""; }; + 04F39F231AEF2AFE005B926E /* PaystackOSXTests-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "PaystackOSXTests-Release.xcconfig"; sourceTree = ""; }; + 04F39F241AEF2AFE005B926E /* PaystackOSXTests-Shared.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "PaystackOSXTests-Shared.xcconfig"; sourceTree = ""; }; + 04FCFA171BD59A8C00297732 /* PSTCKCategoryLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PSTCKCategoryLoader.h; sourceTree = ""; }; + 04FCFA181BD59A8C00297732 /* PSTCKCategoryLoader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSTCKCategoryLoader.m; sourceTree = ""; }; + 10500AB11C8135D800EEF7CF /* PSTCKRSA.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PSTCKRSA.m; path = RSA/PSTCKRSA.m; sourceTree = ""; }; + 10500AB31C8135F800EEF7CF /* PSTCKRSA.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PSTCKRSA.h; path = RSA/PSTCKRSA.h; sourceTree = ""; }; + 10500AB41C8136EF00EEF7CF /* PSTCKRSATest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PSTCKRSATest.m; sourceTree = ""; }; + 11C74B9B164043050071C2CA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + 4A0D74F918F6106100966D7B /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; + C1718D541C3B2E5B002A7CB3 /* UIImage+Paystack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "UIImage+Paystack.h"; path = "PublicHeaders/UI/UIImage+Paystack.h"; sourceTree = ""; }; + C1718D551C3B2E5B002A7CB3 /* UIImage+Paystack.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Paystack.m"; path = "UI/UIImage+Paystack.m"; sourceTree = ""; }; + C178CD441C45607D00851C69 /* UIImage+PaystackTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+PaystackTest.m"; sourceTree = ""; }; + FAFC12C516E5767F0066297F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 045E7C001A5F41DE004751EF /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 049E84A81A605D93000B66CD /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 049E84D71A605E99000B66CD /* AddressBook.framework in Frameworks */, + 049E84D61A605E8F000B66CD /* PassKit.framework in Frameworks */, + 049E84D51A605E82000B66CD /* Security.framework in Frameworks */, + 049E84D41A605E7C000B66CD /* Foundation.framework in Frameworks */, + 049E84D31A605E6A000B66CD /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04CDB43E1A5F2E1800B854EE /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 04533E7D1A6877F400C7E52E /* PassKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04D12C021A5F556D0010446E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04D12C0D1A5F556D0010446E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 04D12C111A5F556D0010446E /* PaystackOSX.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 0438EF251B74162700D506CC /* UI */ = { + isa = PBXGroup; + children = ( + 04E32A9C1B7A9490009C9E35 /* PSTCKPaymentCardTextField.h */, + 0438EF291B7416BB00D506CC /* PSTCKPaymentCardTextField.m */, + 0438EF261B7416BB00D506CC /* PSTCKFormTextField.h */, + 0438EF271B7416BB00D506CC /* PSTCKFormTextField.m */, + 0438EF2A1B7416BB00D506CC /* PSTCKPaymentCardTextFieldViewModel.h */, + 0438EF2B1B7416BB00D506CC /* PSTCKPaymentCardTextFieldViewModel.m */, + C1718D541C3B2E5B002A7CB3 /* UIImage+Paystack.h */, + C1718D551C3B2E5B002A7CB3 /* UIImage+Paystack.m */, + ); + name = UI; + sourceTree = ""; + }; + 0438EF871B741C2800D506CC /* Resources */ = { + isa = PBXGroup; + children = ( + 0438EF881B741C2800D506CC /* Images */, + ); + path = Resources; + sourceTree = ""; + }; + 0438EF881B741C2800D506CC /* Images */ = { + isa = PBXGroup; + children = ( + 0438EF891B741C2800D506CC /* pstck_card_amex.png */, + 0438EF8A1B741C2800D506CC /* pstck_card_amex@2x.png */, + 0438EF8B1B741C2800D506CC /* pstck_card_amex@3x.png */, + 0438EF8C1B741C2800D506CC /* pstck_card_cvc.png */, + 0438EF8D1B741C2800D506CC /* pstck_card_cvc@2x.png */, + 0438EF8E1B741C2800D506CC /* pstck_card_cvc@3x.png */, + 0438EF8F1B741C2800D506CC /* pstck_card_cvc_amex.png */, + 0438EF901B741C2800D506CC /* pstck_card_cvc_amex@2x.png */, + 0438EF911B741C2800D506CC /* pstck_card_cvc_amex@3x.png */, + 0438EF921B741C2800D506CC /* pstck_card_diners.png */, + 0438EF931B741C2800D506CC /* pstck_card_diners@2x.png */, + 0438EF941B741C2800D506CC /* pstck_card_diners@3x.png */, + 0438EF951B741C2800D506CC /* pstck_card_discover.png */, + 0438EF961B741C2800D506CC /* pstck_card_discover@2x.png */, + 0438EF971B741C2800D506CC /* pstck_card_discover@3x.png */, + 0438EF981B741C2800D506CC /* pstck_card_jcb.png */, + 0438EF991B741C2800D506CC /* pstck_card_jcb@2x.png */, + 0438EF9A1B741C2800D506CC /* pstck_card_jcb@3x.png */, + 0438EF9B1B741C2800D506CC /* pstck_card_mastercard.png */, + 0438EF9C1B741C2800D506CC /* pstck_card_mastercard@2x.png */, + 0438EF9D1B741C2800D506CC /* pstck_card_mastercard@3x.png */, + 0438EF9E1B741C2800D506CC /* pstck_card_placeholder.png */, + 0438EF9F1B741C2800D506CC /* pstck_card_placeholder@2x.png */, + 0438EFA01B741C2800D506CC /* pstck_card_placeholder@3x.png */, + 042CA1B31B7BD84100AF0DA6 /* pstck_card_placeholder_template.png */, + 042CA1B41B7BD84100AF0DA6 /* pstck_card_placeholder_template@2x.png */, + 042CA1B51B7BD84100AF0DA6 /* pstck_card_placeholder_template@3x.png */, + 0438EFA11B741C2800D506CC /* pstck_card_visa.png */, + 0438EFA21B741C2800D506CC /* pstck_card_visa@2x.png */, + 0438EFA31B741C2800D506CC /* pstck_card_visa@3x.png */, + ); + path = Images; + sourceTree = ""; + }; + 04A58A451BC603BB004E7BC2 /* Fabric */ = { + isa = PBXGroup; + children = ( + 04A58A461BC603BB004E7BC2 /* FABKitProtocol.h */, + 04A58A471BC603BB004E7BC2 /* Fabric+FABKits.h */, + 04A58A481BC603BB004E7BC2 /* Fabric.h */, + ); + name = Fabric; + path = Paystack/Fabric; + sourceTree = ""; + }; + 04B33F2F1BC7414C00DD8120 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 04B33F301BC7417B00DD8120 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 04CDB4D21A5F30A700B854EE /* Paystack */ = { + isa = PBXGroup; + children = ( + 10500AB01C81357A00EEF7CF /* RSA */, + 04CDB4A91A5F30A700B854EE /* Paystack.h */, + 04F39F091AEF2AFE005B926E /* BuildConfigurations */, + 0438EF871B741C2800D506CC /* Resources */, + 0438EF251B74162700D506CC /* UI */, + 04B33F2F1BC7414C00DD8120 /* Supporting Files */, + 04CDB4C21A5F30A700B854EE /* PSTCKAPIClient.h */, + 04CDB4C31A5F30A700B854EE /* PSTCKAPIClient.m */, + 049952D11BCF13DD0088C703 /* PSTCKAPIClient+Private.h */, + 049952CD1BCF13510088C703 /* PSTCKAPIPostRequest.h */, + 049952CE1BCF13510088C703 /* PSTCKAPIPostRequest.m */, + 04CDB4C41A5F30A700B854EE /* PSTCKFormEncoder.h */, + 04CDB4C51A5F30A700B854EE /* PSTCKFormEncoder.m */, + 0438EF461B74183100D506CC /* PSTCKCardBrand.h */, + 04F213301BCEAB61001D6F22 /* PSTCKFormEncodable.h */, + 04F213341BCECB1C001D6F22 /* PSTCKAPIResponseDecodable.h */, + 04CDE5BB1BC1F21500548833 /* PSTCKCardParams.h */, + 04CDE5B41BC1F1F100548833 /* PSTCKCardParams.m */, + 04CDB4CA1A5F30A700B854EE /* PSTCKCard.h */, + 04CDB4CB1A5F30A700B854EE /* PSTCKCard.m */, + 04EBC7511B7533C300A0E6AE /* PSTCKCardValidationState.h */, + 04EBC7521B7533C300A0E6AE /* PSTCKCardValidator.h */, + 0438EF3F1B74170D00D506CC /* PSTCKCardValidator.m */, + 04CDB4CC1A5F30A700B854EE /* PSTCKToken.h */, + 04CDB4CD1A5F30A700B854EE /* PSTCKToken.m */, + 04CDB4CE1A5F30A700B854EE /* PaystackError.h */, + 04CDB4CF1A5F30A700B854EE /* PaystackError.m */, + 0433EB471BD06313003912B4 /* NSDictionary+Paystack.h */, + 0433EB481BD06313003912B4 /* NSDictionary+Paystack.m */, + 04FCFA171BD59A8C00297732 /* PSTCKCategoryLoader.h */, + 04FCFA181BD59A8C00297732 /* PSTCKCategoryLoader.m */, + ); + name = Paystack; + path = Tests/../Paystack; + sourceTree = ""; + }; + 04CDB5281A5F3A9300B854EE /* PaystackTests */ = { + isa = PBXGroup; + children = ( + 04CDB51F1A5F3A9300B854EE /* PSTCKFormEncoderTest.m */, + 04CDB51E1A5F3A9300B854EE /* PSTCKAPIClientTest.m */, + 04CDB5241A5F3A9300B854EE /* PSTCKCardFunctionalTest.m */, + 0438EF4A1B741B0100D506CC /* PSTCKCardValidatorTest.m */, + 045A62AA1B8E7259000165CE /* PSTCKPaymentCardTextFieldTest.m */, + 0438EF4B1B741B0100D506CC /* PSTCKPaymentCardTextFieldViewModelTest.m */, + 04CDB5251A5F3A9300B854EE /* PSTCKCardTest.m */, + 04CDB5261A5F3A9300B854EE /* PSTCKCertTest.m */, + 04CDB5271A5F3A9300B854EE /* PSTCKTokenTest.m */, + C178CD441C45607D00851C69 /* UIImage+PaystackTest.m */, + 10500AB41C8136EF00EEF7CF /* PSTCKRSATest.m */, + ); + name = PaystackTests; + path = Tests/Tests; + sourceTree = ""; + }; + 04F39F091AEF2AFE005B926E /* BuildConfigurations */ = { + isa = PBXGroup; + children = ( + 0401C6E61BA8E3C300CE8A6D /* module.modulemap */, + 04F39F0C1AEF2AFE005B926E /* Project-Shared.xcconfig */, + 04F39F0A1AEF2AFE005B926E /* Project-Debug.xcconfig */, + 04F39F0B1AEF2AFE005B926E /* Project-Release.xcconfig */, + 04F39F0F1AEF2AFE005B926E /* PaystackiOS Tests-Shared.xcconfig */, + 04F39F0D1AEF2AFE005B926E /* PaystackiOS Tests-Debug.xcconfig */, + 04F39F0E1AEF2AFE005B926E /* PaystackiOS Tests-Release.xcconfig */, + 04F39F121AEF2AFE005B926E /* PaystackiOS-Shared.xcconfig */, + 04F39F101AEF2AFE005B926E /* PaystackiOS-Debug.xcconfig */, + 04F39F111AEF2AFE005B926E /* PaystackiOS-Release.xcconfig */, + 04F39F151AEF2AFE005B926E /* PaystackiOSStatic.xcconfig */, + 04F39F181AEF2AFE005B926E /* PaystackiOSStaticFramework.xcconfig */, + 04F39F211AEF2AFE005B926E /* PaystackOSX-Shared.xcconfig */, + 04F39F1F1AEF2AFE005B926E /* PaystackOSX-Debug.xcconfig */, + 04F39F201AEF2AFE005B926E /* PaystackOSX-Release.xcconfig */, + 04F39F241AEF2AFE005B926E /* PaystackOSXTests-Shared.xcconfig */, + 04F39F221AEF2AFE005B926E /* PaystackOSXTests-Debug.xcconfig */, + 04F39F231AEF2AFE005B926E /* PaystackOSXTests-Release.xcconfig */, + ); + path = BuildConfigurations; + sourceTree = ""; + }; + 10500AB01C81357A00EEF7CF /* RSA */ = { + isa = PBXGroup; + children = ( + 10500AB11C8135D800EEF7CF /* PSTCKRSA.m */, + 10500AB31C8135F800EEF7CF /* PSTCKRSA.h */, + ); + name = RSA; + sourceTree = ""; + }; + 11C74B8D164043050071C2CA = { + isa = PBXGroup; + children = ( + 04CDB4D21A5F30A700B854EE /* Paystack */, + 04CDB5281A5F3A9300B854EE /* PaystackTests */, + 11C74B9A164043050071C2CA /* Frameworks */, + 11C74B99164043050071C2CA /* Products */, + ); + sourceTree = ""; + }; + 11C74B99164043050071C2CA /* Products */ = { + isa = PBXGroup; + children = ( + 04CDB4421A5F2E1800B854EE /* Paystack.framework */, + 045E7C031A5F41DE004751EF /* PaystackiOS Tests.xctest */, + 04D12C061A5F556D0010446E /* PaystackOSX.framework */, + 04D12C101A5F556D0010446E /* PaystackOSXTests.xctest */, + 049E84AB1A605D93000B66CD /* libPaystack.a */, + ); + name = Products; + sourceTree = ""; + }; + 11C74B9A164043050071C2CA /* Frameworks */ = { + isa = PBXGroup; + children = ( + 04A58A451BC603BB004E7BC2 /* Fabric */, + 04365D2C1A4CF86C00A3E1D4 /* CoreGraphics.framework */, + 04B94BC71A47B78A00092C46 /* AddressBook.framework */, + 04D5BF9019BF958F009521A5 /* PassKit.framework */, + 4A0D74F918F6106100966D7B /* Security.framework */, + 11C74B9B164043050071C2CA /* Foundation.framework */, + FAFC12C516E5767F0066297F /* UIKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 04415C711A6605BD001225ED /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 04EBC7541B7533C300A0E6AE /* PSTCKCardValidationState.h in Headers */, + 04EBC7581B7533C300A0E6AE /* PSTCKCardValidator.h in Headers */, + 0438EF2D1B7416BB00D506CC /* PSTCKFormTextField.h in Headers */, + 04415C831A6605D9001225ED /* PSTCKCard.h in Headers */, + 0438EF481B74183100D506CC /* PSTCKCardBrand.h in Headers */, + 04415C841A6605D9001225ED /* PSTCKToken.h in Headers */, + 04E32A9E1B7A9490009C9E35 /* PSTCKPaymentCardTextField.h in Headers */, + 10500ABE1C8216C200EEF7CF /* PSTCKRSA.h in Headers */, + 04415C721A6605D9001225ED /* Paystack.h in Headers */, + 04415C851A6605D9001225ED /* PaystackError.h in Headers */, + 04415C7F1A6605D9001225ED /* PSTCKAPIClient.h in Headers */, + 04CDE5BF1BC1FD4500548833 /* PSTCKCardParams.h in Headers */, + 0438EF391B7416BB00D506CC /* PSTCKPaymentCardTextFieldViewModel.h in Headers */, + 04415C801A6605D9001225ED /* PSTCKFormEncoder.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 049E84D81A605EAA000B66CD /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 04EBC7561B7533C300A0E6AE /* PSTCKCardValidationState.h in Headers */, + 04EBC75A1B7533C300A0E6AE /* PSTCKCardValidator.h in Headers */, + 049E84D91A605EF0000B66CD /* Paystack.h in Headers */, + 0433EB4B1BD06313003912B4 /* NSDictionary+Paystack.h in Headers */, + 0438EF2E1B7416BB00D506CC /* PSTCKFormTextField.h in Headers */, + 049E84E61A605EF0000B66CD /* PSTCKAPIClient.h in Headers */, + 049E84EA1A605EF0000B66CD /* PSTCKCard.h in Headers */, + 049E84EB1A605EF0000B66CD /* PSTCKToken.h in Headers */, + 04E32AA01B7A9490009C9E35 /* PSTCKPaymentCardTextField.h in Headers */, + 0438EF491B74183100D506CC /* PSTCKCardBrand.h in Headers */, + 049952D61BCF14930088C703 /* PSTCKAPIPostRequest.h in Headers */, + 04F213331BCEAB61001D6F22 /* PSTCKFormEncodable.h in Headers */, + 10500ABD1C8215F400EEF7CF /* PSTCKRSA.h in Headers */, + 049E84EC1A605EF0000B66CD /* PaystackError.h in Headers */, + C1718D581C3B2E60002A7CB3 /* UIImage+Paystack.h in Headers */, + 04FCFA191BD59A8C00297732 /* PSTCKCategoryLoader.h in Headers */, + 049952D41BCF13DD0088C703 /* PSTCKAPIClient+Private.h in Headers */, + 0438EF3A1B7416BB00D506CC /* PSTCKPaymentCardTextFieldViewModel.h in Headers */, + 04CDE5BE1BC1F21500548833 /* PSTCKCardParams.h in Headers */, + 04F213371BCECB1C001D6F22 /* PSTCKAPIResponseDecodable.h in Headers */, + 049E84E71A605EF0000B66CD /* PSTCKFormEncoder.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04CDB43F1A5F2E1800B854EE /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 04EBC7531B7533C300A0E6AE /* PSTCKCardValidationState.h in Headers */, + 04EBC7571B7533C300A0E6AE /* PSTCKCardValidator.h in Headers */, + 0433EB491BD06313003912B4 /* NSDictionary+Paystack.h in Headers */, + 04CDB50E1A5F30A700B854EE /* PSTCKCard.h in Headers */, + 0438EF2C1B7416BB00D506CC /* PSTCKFormTextField.h in Headers */, + 049952D21BCF13DD0088C703 /* PSTCKAPIClient+Private.h in Headers */, + C1718D561C3B2E5B002A7CB3 /* UIImage+Paystack.h in Headers */, + 04CDB5121A5F30A700B854EE /* PSTCKToken.h in Headers */, + 049952CF1BCF13510088C703 /* PSTCKAPIPostRequest.h in Headers */, + 0438EF471B74183100D506CC /* PSTCKCardBrand.h in Headers */, + 10A653A31C88CC5900EBC974 /* PSTCKCardParams.h in Headers */, + 04CDB5161A5F30A700B854EE /* PaystackError.h in Headers */, + 10FC52071C88DDB3004A0733 /* PSTCKRSA.h in Headers */, + 04E32A9D1B7A9490009C9E35 /* PSTCKPaymentCardTextField.h in Headers */, + 04F213311BCEAB61001D6F22 /* PSTCKFormEncodable.h in Headers */, + 04CDB5021A5F30A700B854EE /* PSTCKFormEncoder.h in Headers */, + 0438EF381B7416BB00D506CC /* PSTCKPaymentCardTextFieldViewModel.h in Headers */, + 04F213351BCECB1C001D6F22 /* PSTCKAPIResponseDecodable.h in Headers */, + 04CDB4D31A5F30A700B854EE /* Paystack.h in Headers */, + 04CDB4FE1A5F30A700B854EE /* PSTCKAPIClient.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04D12C031A5F556D0010446E /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 04EBC7591B7533C300A0E6AE /* PSTCKCardValidator.h in Headers */, + 04EBC7551B7533C300A0E6AE /* PSTCKCardValidationState.h in Headers */, + 04D12C2C1A5F55D10010446E /* Paystack.h in Headers */, + 04CDE5BD1BC1F21500548833 /* PSTCKCardParams.h in Headers */, + 04F213321BCEAB61001D6F22 /* PSTCKFormEncodable.h in Headers */, + 04D12C391A5F55D10010446E /* PSTCKAPIClient.h in Headers */, + 049952D31BCF13DD0088C703 /* PSTCKAPIClient+Private.h in Headers */, + 04D12C3D1A5F55D10010446E /* PSTCKCard.h in Headers */, + 04D12C3E1A5F55D10010446E /* PSTCKToken.h in Headers */, + 04D12C3F1A5F55D10010446E /* PaystackError.h in Headers */, + 049952D51BCF14920088C703 /* PSTCKAPIPostRequest.h in Headers */, + 0438EFDB1B7524AA00D506CC /* PSTCKCardBrand.h in Headers */, + 10500ABB1C82155B00EEF7CF /* PSTCKRSA.h in Headers */, + 0433EB4A1BD06313003912B4 /* NSDictionary+Paystack.h in Headers */, + 04F213361BCECB1C001D6F22 /* PSTCKAPIResponseDecodable.h in Headers */, + 04D12C3A1A5F55D10010446E /* PSTCKFormEncoder.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 045E7C021A5F41DE004751EF /* PaystackiOS Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 045E7C0C1A5F41DE004751EF /* Build configuration list for PBXNativeTarget "PaystackiOS Tests" */; + buildPhases = ( + 045E7BFF1A5F41DE004751EF /* Sources */, + 045E7C001A5F41DE004751EF /* Frameworks */, + 045E7C011A5F41DE004751EF /* Resources */, + 04415C711A6605BD001225ED /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + 045E7C0B1A5F41DE004751EF /* PBXTargetDependency */, + ); + name = "PaystackiOS Tests"; + productName = "PaystackiOS Tests"; + productReference = 045E7C031A5F41DE004751EF /* PaystackiOS Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 049E84AA1A605D93000B66CD /* PaystackiOSStatic */ = { + isa = PBXNativeTarget; + buildConfigurationList = 049E84BC1A605D93000B66CD /* Build configuration list for PBXNativeTarget "PaystackiOSStatic" */; + buildPhases = ( + 049E84A71A605D93000B66CD /* Sources */, + 049E84A81A605D93000B66CD /* Frameworks */, + 049E84A91A605D93000B66CD /* Copy Files */, + 049E84D81A605EAA000B66CD /* Headers */, + 049E85211A607DA4000B66CD /* Build Framework */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PaystackiOSStatic; + productName = PaystackiOSStatic; + productReference = 049E84AB1A605D93000B66CD /* libPaystack.a */; + productType = "com.apple.product-type.library.static"; + }; + 04CDB4411A5F2E1800B854EE /* PaystackiOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 04CDB4551A5F2E1800B854EE /* Build configuration list for PBXNativeTarget "PaystackiOS" */; + buildPhases = ( + 04CDB43D1A5F2E1800B854EE /* Sources */, + 04CDB43E1A5F2E1800B854EE /* Frameworks */, + 04CDB43F1A5F2E1800B854EE /* Headers */, + 04CDB4401A5F2E1800B854EE /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PaystackiOS; + productName = "Paystack-iOS"; + productReference = 04CDB4421A5F2E1800B854EE /* Paystack.framework */; + productType = "com.apple.product-type.framework"; + }; + 04D12C051A5F556D0010446E /* PaystackOSX */ = { + isa = PBXNativeTarget; + buildConfigurationList = 04D12C191A5F556D0010446E /* Build configuration list for PBXNativeTarget "PaystackOSX" */; + buildPhases = ( + 04D12C011A5F556D0010446E /* Sources */, + 04D12C021A5F556D0010446E /* Frameworks */, + 04D12C031A5F556D0010446E /* Headers */, + 04D12C041A5F556D0010446E /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = PaystackOSX; + productName = PaystackOSX; + productReference = 04D12C061A5F556D0010446E /* PaystackOSX.framework */; + productType = "com.apple.product-type.framework"; + }; + 04D12C0F1A5F556D0010446E /* PaystackOSXTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 04D12C1C1A5F556D0010446E /* Build configuration list for PBXNativeTarget "PaystackOSXTests" */; + buildPhases = ( + 04D12C0C1A5F556D0010446E /* Sources */, + 04D12C0D1A5F556D0010446E /* Frameworks */, + 04D12C0E1A5F556D0010446E /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 04D12C131A5F556D0010446E /* PBXTargetDependency */, + ); + name = PaystackOSXTests; + productName = PaystackOSXTests; + productReference = 04D12C101A5F556D0010446E /* PaystackOSXTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 11C74B8F164043050071C2CA /* Project object */ = { + isa = PBXProject; + attributes = { + CLASSPREFIX = PSTCK; + LastTestingUpgradeCheck = 0510; + LastUpgradeCheck = 0710; + ORGANIZATIONNAME = "Paystack, Inc"; + TargetAttributes = { + 045E7C021A5F41DE004751EF = { + CreatedOnToolsVersion = 6.1.1; + }; + 049E84AA1A605D93000B66CD = { + CreatedOnToolsVersion = 6.1.1; + }; + 049E85221A607FFD000B66CD = { + CreatedOnToolsVersion = 6.1.1; + }; + 04CDB4411A5F2E1800B854EE = { + CreatedOnToolsVersion = 6.1.1; + }; + 04D12C051A5F556D0010446E = { + CreatedOnToolsVersion = 6.1.1; + }; + 04D12C0F1A5F556D0010446E = { + CreatedOnToolsVersion = 6.1.1; + }; + }; + }; + buildConfigurationList = 11C74B92164043050071C2CA /* Build configuration list for PBXProject "Paystack" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 11C74B8D164043050071C2CA; + productRefGroup = 11C74B99164043050071C2CA /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 04CDB4411A5F2E1800B854EE /* PaystackiOS */, + 045E7C021A5F41DE004751EF /* PaystackiOS Tests */, + 04D12C051A5F556D0010446E /* PaystackOSX */, + 04D12C0F1A5F556D0010446E /* PaystackOSXTests */, + 049E84AA1A605D93000B66CD /* PaystackiOSStatic */, + 049E85221A607FFD000B66CD /* PaystackiOSStaticFramework */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 045E7C011A5F41DE004751EF /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 045A62AE1B8E73AB000165CE /* pstck_card_amex@3x.png in Resources */, + 045A62BD1B8E73AB000165CE /* pstck_card_jcb@3x.png in Resources */, + 045A62C51B8E73AB000165CE /* pstck_card_placeholder_template@2x.png in Resources */, + 045A62BB1B8E73AB000165CE /* pstck_card_jcb.png in Resources */, + 045A62C41B8E73AB000165CE /* pstck_card_placeholder_template.png in Resources */, + 045A62C31B8E73AB000165CE /* pstck_card_placeholder@3x.png in Resources */, + 045A62C71B8E73AB000165CE /* pstck_card_visa.png in Resources */, + 045A62B21B8E73AB000165CE /* pstck_card_cvc_amex.png in Resources */, + 045A62B31B8E73AB000165CE /* pstck_card_cvc_amex@2x.png in Resources */, + 045A62BC1B8E73AB000165CE /* pstck_card_jcb@2x.png in Resources */, + 045A62AC1B8E73AB000165CE /* pstck_card_amex.png in Resources */, + 045A62B71B8E73AB000165CE /* pstck_card_diners@3x.png in Resources */, + 045A62C21B8E73AB000165CE /* pstck_card_placeholder@2x.png in Resources */, + 045A62B51B8E73AB000165CE /* pstck_card_diners.png in Resources */, + 045A62C81B8E73AB000165CE /* pstck_card_visa@2x.png in Resources */, + 045A62C61B8E73AB000165CE /* pstck_card_placeholder_template@3x.png in Resources */, + 045A62B11B8E73AB000165CE /* pstck_card_cvc@3x.png in Resources */, + 045A62B91B8E73AB000165CE /* pstck_card_discover@2x.png in Resources */, + 045A62BA1B8E73AB000165CE /* pstck_card_discover@3x.png in Resources */, + 045A62B41B8E73AB000165CE /* pstck_card_cvc_amex@3x.png in Resources */, + 045A62B61B8E73AB000165CE /* pstck_card_diners@2x.png in Resources */, + 045A62AF1B8E73AB000165CE /* pstck_card_cvc.png in Resources */, + 045A62B01B8E73AB000165CE /* pstck_card_cvc@2x.png in Resources */, + 045A62C01B8E73AB000165CE /* pstck_card_mastercard@3x.png in Resources */, + 045A62C11B8E73AB000165CE /* pstck_card_placeholder.png in Resources */, + 045A62BF1B8E73AB000165CE /* pstck_card_mastercard@2x.png in Resources */, + 045A62BE1B8E73AB000165CE /* pstck_card_mastercard.png in Resources */, + 045A62B81B8E73AB000165CE /* pstck_card_discover.png in Resources */, + 045A62C91B8E73AB000165CE /* pstck_card_visa@3x.png in Resources */, + 045A62AD1B8E73AB000165CE /* pstck_card_amex@2x.png in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04CDB4401A5F2E1800B854EE /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0438EFA81B741C2800D506CC /* pstck_card_amex@3x.png in Resources */, + 0438EFC61B741C2800D506CC /* pstck_card_jcb@3x.png in Resources */, + 0438EFC21B741C2800D506CC /* pstck_card_jcb.png in Resources */, + 042CA1B61B7BD84100AF0DA6 /* pstck_card_placeholder_template.png in Resources */, + 0438EFD61B741C2800D506CC /* pstck_card_visa@2x.png in Resources */, + 0438EFD21B741C2800D506CC /* pstck_card_placeholder@3x.png in Resources */, + 0438EFB01B741C2800D506CC /* pstck_card_cvc_amex.png in Resources */, + 042CA1B71B7BD84100AF0DA6 /* pstck_card_placeholder_template@2x.png in Resources */, + 0438EFB21B741C2800D506CC /* pstck_card_cvc_amex@2x.png in Resources */, + 0438EFD81B741C2800D506CC /* pstck_card_visa@3x.png in Resources */, + 0438EFC41B741C2800D506CC /* pstck_card_jcb@2x.png in Resources */, + 0438EFA41B741C2800D506CC /* pstck_card_amex.png in Resources */, + 0438EFBA1B741C2800D506CC /* pstck_card_diners@3x.png in Resources */, + 0438EFD01B741C2800D506CC /* pstck_card_placeholder@2x.png in Resources */, + 0438EFB61B741C2800D506CC /* pstck_card_diners.png in Resources */, + 0438EFAE1B741C2800D506CC /* pstck_card_cvc@3x.png in Resources */, + 0438EFBE1B741C2800D506CC /* pstck_card_discover@2x.png in Resources */, + 0438EFC01B741C2800D506CC /* pstck_card_discover@3x.png in Resources */, + 0438EFB41B741C2800D506CC /* pstck_card_cvc_amex@3x.png in Resources */, + 0438EFB81B741C2800D506CC /* pstck_card_diners@2x.png in Resources */, + 0438EFAA1B741C2800D506CC /* pstck_card_cvc.png in Resources */, + 0438EFAC1B741C2800D506CC /* pstck_card_cvc@2x.png in Resources */, + 0438EFCC1B741C2800D506CC /* pstck_card_mastercard@3x.png in Resources */, + 0438EFCE1B741C2800D506CC /* pstck_card_placeholder.png in Resources */, + 0438EFCA1B741C2800D506CC /* pstck_card_mastercard@2x.png in Resources */, + 042CA1B81B7BD84100AF0DA6 /* pstck_card_placeholder_template@3x.png in Resources */, + 0438EFC81B741C2800D506CC /* pstck_card_mastercard.png in Resources */, + 0438EFBC1B741C2800D506CC /* pstck_card_discover.png in Resources */, + 0438EFA61B741C2800D506CC /* pstck_card_amex@2x.png in Resources */, + 0438EFD41B741C2800D506CC /* pstck_card_visa.png in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04D12C041A5F556D0010446E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0438EFA91B741C2800D506CC /* pstck_card_amex@3x.png in Resources */, + 0438EFC71B741C2800D506CC /* pstck_card_jcb@3x.png in Resources */, + 0438EFC31B741C2800D506CC /* pstck_card_jcb.png in Resources */, + 0438EFD71B741C2800D506CC /* pstck_card_visa@2x.png in Resources */, + 0438EFD31B741C2800D506CC /* pstck_card_placeholder@3x.png in Resources */, + 0438EFB11B741C2800D506CC /* pstck_card_cvc_amex.png in Resources */, + 0438EFB31B741C2800D506CC /* pstck_card_cvc_amex@2x.png in Resources */, + 0438EFD91B741C2800D506CC /* pstck_card_visa@3x.png in Resources */, + 0438EFC51B741C2800D506CC /* pstck_card_jcb@2x.png in Resources */, + 0438EFA51B741C2800D506CC /* pstck_card_amex.png in Resources */, + 0438EFBB1B741C2800D506CC /* pstck_card_diners@3x.png in Resources */, + 0438EFD11B741C2800D506CC /* pstck_card_placeholder@2x.png in Resources */, + 0438EFB71B741C2800D506CC /* pstck_card_diners.png in Resources */, + 0438EFAF1B741C2800D506CC /* pstck_card_cvc@3x.png in Resources */, + 0438EFBF1B741C2800D506CC /* pstck_card_discover@2x.png in Resources */, + 0438EFC11B741C2800D506CC /* pstck_card_discover@3x.png in Resources */, + 0438EFB51B741C2800D506CC /* pstck_card_cvc_amex@3x.png in Resources */, + 0438EFB91B741C2800D506CC /* pstck_card_diners@2x.png in Resources */, + 0438EFAB1B741C2800D506CC /* pstck_card_cvc.png in Resources */, + 0438EFAD1B741C2800D506CC /* pstck_card_cvc@2x.png in Resources */, + 0438EFCD1B741C2800D506CC /* pstck_card_mastercard@3x.png in Resources */, + 0438EFCF1B741C2800D506CC /* pstck_card_placeholder.png in Resources */, + 0438EFCB1B741C2800D506CC /* pstck_card_mastercard@2x.png in Resources */, + 0438EFC91B741C2800D506CC /* pstck_card_mastercard.png in Resources */, + 0438EFBD1B741C2800D506CC /* pstck_card_discover.png in Resources */, + 0438EFA71B741C2800D506CC /* pstck_card_amex@2x.png in Resources */, + 0438EFD51B741C2800D506CC /* pstck_card_visa.png in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04D12C0E1A5F556D0010446E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 049E85211A607DA4000B66CD /* Build Framework */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Build Framework"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "set -e\n\nexport FRAMEWORK_DIR=\"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.framework\"\n\n# Create the path to the real Headers directory\nmkdir -p \"${FRAMEWORK_DIR}/Versions/A/Headers\"\nmkdir -p \"${FRAMEWORK_DIR}/Versions/A/Modules\"\n\n# Create the required symlinks\nln -sfh A \"${FRAMEWORK_DIR}/Versions/Current\"\nln -sfh Versions/Current/Headers \"${FRAMEWORK_DIR}/Headers\"\nln -sfh Versions/Current/Modules \"${FRAMEWORK_DIR}/Modules\"\nln -sfh \"Versions/Current/${PRODUCT_NAME}\" \\\n\"${FRAMEWORK_DIR}/${PRODUCT_NAME}\"\n\n# Copy the public headers into the framework\n/bin/cp -a \"${TARGET_BUILD_DIR}/${PUBLIC_HEADERS_FOLDER_PATH}/\" \\\n\"${FRAMEWORK_DIR}/Versions/A/Headers\"\n\necho \"framework module Paystack {\" \\\n\"umbrella header \\\"Paystack.h\\\"\" \\\n\"export *\" \\\n\"module * { export * }\" \\\n\"}\" > \"${FRAMEWORK_DIR}/Versions/A/Modules/module.modulemap\"\n"; + }; + 049E85281A608030000B66CD /* MultiPlatform Build */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "MultiPlatform Build"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "set -e\n\n# If we're already inside this script then die\nif [ -n \"$RW_MULTIPLATFORM_BUILD_IN_PROGRESS\" ]; then\nexit 0\nfi\nexport RW_MULTIPLATFORM_BUILD_IN_PROGRESS=1\n\nRW_FRAMEWORK_NAME=\"Paystack\"\nRW_INPUT_STATIC_LIB=\"libPaystack.a\"\nRW_FRAMEWORK_LOCATION=\"${BUILT_PRODUCTS_DIR}/${RW_FRAMEWORK_NAME}.framework\"\n\nfunction build_static_library {\n # Will rebuild the static library as specified\n # build_static_library sdk\n xcrun xcodebuild -project \"${PROJECT_FILE_PATH}\" \\\n -target \"${TARGET_NAME}\" \\\n -configuration \"${CONFIGURATION}\" \\\n -sdk \"${1}\" \\\n ONLY_ACTIVE_ARCH=NO \\\n BUILD_DIR=\"${BUILD_DIR}\" \\\n OBJROOT=\"${OBJROOT}\" \\\n BUILD_ROOT=\"${BUILD_ROOT}\" \\\n SYMROOT=\"${SYMROOT}\" $ACTION\n}\n\nfunction make_fat_library {\n # Will smash 2 static libs together\n # make_fat_library in1 in2 out\n xcrun lipo -create \"${1}\" \"${2}\" -output \"${3}\"\n}\n\n# 1 - Extract the platform (iphoneos/iphonesimulator) from the SDK name\nif [[ \"$SDK_NAME\" =~ ([A-Za-z]+) ]]; then\nRW_SDK_PLATFORM=${BASH_REMATCH[1]}\nelse\necho \"Could not find platform name from SDK_NAME: $SDK_NAME\"\nexit 1\nfi\n\n# 2 - Extract the version from the SDK\nif [[ \"$SDK_NAME\" =~ ([0-9]+.*$) ]]; then\nRW_SDK_VERSION=${BASH_REMATCH[1]}\nelse\necho \"Could not find sdk version from SDK_NAME: $SDK_NAME\"\nexit 1\nfi\n\n# 3 - Determine the other platform\nif [ \"$RW_SDK_PLATFORM\" == \"iphoneos\" ]; then\nRW_OTHER_PLATFORM=iphonesimulator\nelse\nRW_OTHER_PLATFORM=iphoneos\nfi\n\n# 4 - Find the build directory\nif [[ \"$BUILT_PRODUCTS_DIR\" =~ (.*)$RW_SDK_PLATFORM$ ]]; then\nRW_OTHER_BUILT_PRODUCTS_DIR=\"${BASH_REMATCH[1]}${RW_OTHER_PLATFORM}\"\nelse\necho \"Could not find other platform build directory.\"\nexit 1\nfi\n\n# Build the other platform.\nbuild_static_library \"${RW_OTHER_PLATFORM}${RW_SDK_VERSION}\"\n\n# If we're currently building for iphonesimulator, then need to rebuild\n# to ensure that we get both i386 and x86_64\nif [ \"$RW_SDK_PLATFORM\" == \"iphonesimulator\" ]; then\nbuild_static_library \"${SDK_NAME}\"\nfi\n\n# Join the 2 static libs into 1 and push into the .framework\nmake_fat_library \"${BUILT_PRODUCTS_DIR}/${RW_INPUT_STATIC_LIB}\" \\\n\"${RW_OTHER_BUILT_PRODUCTS_DIR}/${RW_INPUT_STATIC_LIB}\" \\\n\"${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}\"\n\n/usr/bin/strip -Sx \"${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}\"\n\n# Ensure that the framework is present in both platform's build directories\ncp -a \"${RW_FRAMEWORK_LOCATION}/Versions/A/${RW_FRAMEWORK_NAME}\" \\\n\"${RW_OTHER_BUILT_PRODUCTS_DIR}/${RW_FRAMEWORK_NAME}.framework/Versions/A/${RW_FRAMEWORK_NAME}\""; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 045E7BFF1A5F41DE004751EF /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0438EF3C1B7416BB00D506CC /* PSTCKPaymentCardTextFieldViewModel.m in Sources */, + 0438EF441B74170D00D506CC /* PSTCKCardValidator.m in Sources */, + 0438EF301B7416BB00D506CC /* PSTCKFormTextField.m in Sources */, + C178CD451C45607D00851C69 /* UIImage+PaystackTest.m in Sources */, + 0438EF4C1B741B0100D506CC /* PSTCKCardValidatorTest.m in Sources */, + 04415C611A6605B5001225ED /* PSTCKFormEncoder.m in Sources */, + 045A62AB1B8E7259000165CE /* PSTCKPaymentCardTextFieldTest.m in Sources */, + 0438EF4D1B741B0100D506CC /* PSTCKPaymentCardTextFieldViewModelTest.m in Sources */, + 04415C641A6605B5001225ED /* PSTCKCard.m in Sources */, + 04415C651A6605B5001225ED /* PSTCKToken.m in Sources */, + 04415C661A6605B5001225ED /* PaystackError.m in Sources */, + 10500AB51C8136EF00EEF7CF /* PSTCKRSATest.m in Sources */, + 04415C671A6605B5001225ED /* PSTCKAPIClientTest.m in Sources */, + 04415C681A6605B5001225ED /* PSTCKFormEncoderTest.m in Sources */, + 0438EF361B7416BB00D506CC /* PSTCKPaymentCardTextField.m in Sources */, + 04415C6D1A6605B5001225ED /* PSTCKCardFunctionalTest.m in Sources */, + 04415C6E1A6605B5001225ED /* PSTCKCardTest.m in Sources */, + 04415C6F1A6605B5001225ED /* PSTCKCertTest.m in Sources */, + 04415C701A6605B5001225ED /* PSTCKTokenTest.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 049E84A71A605D93000B66CD /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0438EF451B74170D00D506CC /* PSTCKCardValidator.m in Sources */, + 0438EF311B7416BB00D506CC /* PSTCKFormTextField.m in Sources */, + 04FCFA1A1BD59A8C00297732 /* PSTCKCategoryLoader.m in Sources */, + C181DD721C3B34E300DEB9FE /* UIImage+Paystack.m in Sources */, + 0438EF371B7416BB00D506CC /* PSTCKPaymentCardTextField.m in Sources */, + 049E84CC1A605DE0000B66CD /* PSTCKAPIClient.m in Sources */, + 049E84CD1A605DE0000B66CD /* PSTCKFormEncoder.m in Sources */, + 049E84D01A605DE0000B66CD /* PSTCKCard.m in Sources */, + 0433EB4E1BD06313003912B4 /* NSDictionary+Paystack.m in Sources */, + 0438EF3D1B7416BB00D506CC /* PSTCKPaymentCardTextFieldViewModel.m in Sources */, + 04CDE5BA1BC1F1F100548833 /* PSTCKCardParams.m in Sources */, + 049E84D11A605DE0000B66CD /* PSTCKToken.m in Sources */, + 049E84D21A605DE0000B66CD /* PaystackError.m in Sources */, + 049952D81BCF14990088C703 /* PSTCKAPIPostRequest.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04CDB43D1A5F2E1800B854EE /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0438EF431B74170D00D506CC /* PSTCKCardValidator.m in Sources */, + 0438EF2F1B7416BB00D506CC /* PSTCKFormTextField.m in Sources */, + 04CDB5101A5F30A700B854EE /* PSTCKCard.m in Sources */, + 04CDB5001A5F30A700B854EE /* PSTCKAPIClient.m in Sources */, + 10500AB21C8135D800EEF7CF /* PSTCKRSA.m in Sources */, + 04CDB5181A5F30A700B854EE /* PaystackError.m in Sources */, + C1718D571C3B2E5B002A7CB3 /* UIImage+Paystack.m in Sources */, + 0438EF351B7416BB00D506CC /* PSTCKPaymentCardTextField.m in Sources */, + 04CDB5041A5F30A700B854EE /* PSTCKFormEncoder.m in Sources */, + 04CDB5141A5F30A700B854EE /* PSTCKToken.m in Sources */, + 0433EB4C1BD06313003912B4 /* NSDictionary+Paystack.m in Sources */, + 0438EF3B1B7416BB00D506CC /* PSTCKPaymentCardTextFieldViewModel.m in Sources */, + 04CDE5B81BC1F1F100548833 /* PSTCKCardParams.m in Sources */, + 049952D01BCF13510088C703 /* PSTCKAPIPostRequest.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04D12C011A5F556D0010446E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 10500ABC1C82157A00EEF7CF /* PSTCKRSA.m in Sources */, + 04E32A9B1B7A93FC009C9E35 /* PSTCKCardValidator.m in Sources */, + 04CDE5B91BC1F1F100548833 /* PSTCKCardParams.m in Sources */, + 04D12C251A5F55AD0010446E /* PSTCKAPIClient.m in Sources */, + 04D12C261A5F55AD0010446E /* PSTCKFormEncoder.m in Sources */, + 04D12C291A5F55AD0010446E /* PSTCKCard.m in Sources */, + 04D12C2A1A5F55AD0010446E /* PSTCKToken.m in Sources */, + 0433EB4D1BD06313003912B4 /* NSDictionary+Paystack.m in Sources */, + 049952D71BCF14980088C703 /* PSTCKAPIPostRequest.m in Sources */, + 04D12C2B1A5F55AD0010446E /* PaystackError.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04D12C0C1A5F556D0010446E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 04D12C401A5F55FA0010446E /* PSTCKAPIClientTest.m in Sources */, + 04D12C411A5F55FA0010446E /* PSTCKFormEncoderTest.m in Sources */, + 04D12C451A5F55FA0010446E /* PSTCKCardFunctionalTest.m in Sources */, + 04D12C461A5F55FA0010446E /* PSTCKCardTest.m in Sources */, + 04D12C471A5F55FA0010446E /* PSTCKCertTest.m in Sources */, + 04D12C481A5F55FA0010446E /* PSTCKTokenTest.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 045E7C0B1A5F41DE004751EF /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 04CDB4411A5F2E1800B854EE /* PaystackiOS */; + targetProxy = 045E7C0A1A5F41DE004751EF /* PBXContainerItemProxy */; + }; + 049E85271A608027000B66CD /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 049E84AA1A605D93000B66CD /* PaystackiOSStatic */; + targetProxy = 049E85261A608027000B66CD /* PBXContainerItemProxy */; + }; + 04D12C131A5F556D0010446E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 04D12C051A5F556D0010446E /* PaystackOSX */; + targetProxy = 04D12C121A5F556D0010446E /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 045E7C0D1A5F41DE004751EF /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 04F39F0D1AEF2AFE005B926E /* PaystackiOS Tests-Debug.xcconfig */; + buildSettings = { + }; + name = Debug; + }; + 045E7C0E1A5F41DE004751EF /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 04F39F0E1AEF2AFE005B926E /* PaystackiOS Tests-Release.xcconfig */; + buildSettings = { + }; + name = Release; + }; + 049E84BD1A605D93000B66CD /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 04F39F151AEF2AFE005B926E /* PaystackiOSStatic.xcconfig */; + buildSettings = { + }; + name = Debug; + }; + 049E84BE1A605D93000B66CD /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 04F39F151AEF2AFE005B926E /* PaystackiOSStatic.xcconfig */; + buildSettings = { + }; + name = Release; + }; + 049E85241A607FFD000B66CD /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 04F39F181AEF2AFE005B926E /* PaystackiOSStaticFramework.xcconfig */; + buildSettings = { + }; + name = Debug; + }; + 049E85251A607FFD000B66CD /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 04F39F181AEF2AFE005B926E /* PaystackiOSStaticFramework.xcconfig */; + buildSettings = { + }; + name = Release; + }; + 04CDB4561A5F2E1800B854EE /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 04F39F101AEF2AFE005B926E /* PaystackiOS-Debug.xcconfig */; + buildSettings = { + PRODUCT_BUNDLE_IDENTIFIER = "com.paystack.paystack-ios"; + }; + name = Debug; + }; + 04CDB4571A5F2E1800B854EE /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 04F39F111AEF2AFE005B926E /* PaystackiOS-Release.xcconfig */; + buildSettings = { + PRODUCT_BUNDLE_IDENTIFIER = "com.paystack.paystack-ios"; + }; + name = Release; + }; + 04D12C1A1A5F556D0010446E /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 04F39F1F1AEF2AFE005B926E /* PaystackOSX-Debug.xcconfig */; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.paystack.paystack-ios"; + }; + name = Debug; + }; + 04D12C1B1A5F556D0010446E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 04F39F201AEF2AFE005B926E /* PaystackOSX-Release.xcconfig */; + buildSettings = { + APPLICATION_EXTENSION_API_ONLY = NO; + PRODUCT_BUNDLE_IDENTIFIER = "com.paystack.paystack-ios"; + }; + name = Release; + }; + 04D12C1D1A5F556D0010446E /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 04F39F221AEF2AFE005B926E /* PaystackOSXTests-Debug.xcconfig */; + buildSettings = { + }; + name = Debug; + }; + 04D12C1E1A5F556D0010446E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 04F39F231AEF2AFE005B926E /* PaystackOSXTests-Release.xcconfig */; + buildSettings = { + }; + name = Release; + }; + 11C74BBA164043050071C2CA /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 04F39F0A1AEF2AFE005B926E /* Project-Debug.xcconfig */; + buildSettings = { + ENABLE_TESTABILITY = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.7; + ONLY_ACTIVE_ARCH = YES; + }; + name = Debug; + }; + 11C74BBB164043050071C2CA /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 04F39F0B1AEF2AFE005B926E /* Project-Release.xcconfig */; + buildSettings = { + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MACOSX_DEPLOYMENT_TARGET = 10.7; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 045E7C0C1A5F41DE004751EF /* Build configuration list for PBXNativeTarget "PaystackiOS Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 045E7C0D1A5F41DE004751EF /* Debug */, + 045E7C0E1A5F41DE004751EF /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 049E84BC1A605D93000B66CD /* Build configuration list for PBXNativeTarget "PaystackiOSStatic" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 049E84BD1A605D93000B66CD /* Debug */, + 049E84BE1A605D93000B66CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 049E85231A607FFD000B66CD /* Build configuration list for PBXAggregateTarget "PaystackiOSStaticFramework" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 049E85241A607FFD000B66CD /* Debug */, + 049E85251A607FFD000B66CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 04CDB4551A5F2E1800B854EE /* Build configuration list for PBXNativeTarget "PaystackiOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 04CDB4561A5F2E1800B854EE /* Debug */, + 04CDB4571A5F2E1800B854EE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 04D12C191A5F556D0010446E /* Build configuration list for PBXNativeTarget "PaystackOSX" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 04D12C1A1A5F556D0010446E /* Debug */, + 04D12C1B1A5F556D0010446E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 04D12C1C1A5F556D0010446E /* Build configuration list for PBXNativeTarget "PaystackOSXTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 04D12C1D1A5F556D0010446E /* Debug */, + 04D12C1E1A5F556D0010446E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 11C74B92164043050071C2CA /* Build configuration list for PBXProject "Paystack" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 11C74BBA164043050071C2CA /* Debug */, + 11C74BBB164043050071C2CA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 11C74B8F164043050071C2CA /* Project object */; +} diff --git a/Paystack.xcodeproj/xcshareddata/xcschemes/PaystackOSX Tests.xcscheme b/Paystack.xcodeproj/xcshareddata/xcschemes/PaystackOSX Tests.xcscheme new file mode 100644 index 0000000..c43ec83 --- /dev/null +++ b/Paystack.xcodeproj/xcshareddata/xcschemes/PaystackOSX Tests.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Paystack.xcodeproj/xcshareddata/xcschemes/PaystackOSX.xcscheme b/Paystack.xcodeproj/xcshareddata/xcschemes/PaystackOSX.xcscheme new file mode 100644 index 0000000..70bd4a0 --- /dev/null +++ b/Paystack.xcodeproj/xcshareddata/xcschemes/PaystackOSX.xcscheme @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Paystack.xcodeproj/xcshareddata/xcschemes/PaystackiOS Tests.xcscheme b/Paystack.xcodeproj/xcshareddata/xcschemes/PaystackiOS Tests.xcscheme new file mode 100644 index 0000000..803f04d --- /dev/null +++ b/Paystack.xcodeproj/xcshareddata/xcschemes/PaystackiOS Tests.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Paystack.xcodeproj/xcshareddata/xcschemes/PaystackiOS.xcscheme b/Paystack.xcodeproj/xcshareddata/xcschemes/PaystackiOS.xcscheme new file mode 100644 index 0000000..0801f68 --- /dev/null +++ b/Paystack.xcodeproj/xcshareddata/xcschemes/PaystackiOS.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Paystack.xcodeproj/xcshareddata/xcschemes/PaystackiOSStaticFramework.xcscheme b/Paystack.xcodeproj/xcshareddata/xcschemes/PaystackiOSStaticFramework.xcscheme new file mode 100644 index 0000000..9719849 --- /dev/null +++ b/Paystack.xcodeproj/xcshareddata/xcschemes/PaystackiOSStaticFramework.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Paystack.xcworkspace/contents.xcworkspacedata b/Paystack.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..f5dff72 --- /dev/null +++ b/Paystack.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/Paystack.xcworkspace/xcshareddata/Paystack.xccheckout b/Paystack.xcworkspace/xcshareddata/Paystack.xccheckout new file mode 100644 index 0000000..ef47b15 --- /dev/null +++ b/Paystack.xcworkspace/xcshareddata/Paystack.xccheckout @@ -0,0 +1,53 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + 1610AC64-BC46-4B78-8270-41A398C514B7 + IDESourceControlProjectName + Paystack + IDESourceControlProjectOriginsDictionary + + A5C151FC3F18980DA2906AAA3DE9140767EF2310 + ssh://github.com/stripe/stripe-ios.git + D0DC6CE0350266C4AFFCC35DA49B75AE57E8D73E + github.com:stripe/PaymentKit.git + + IDESourceControlProjectPath + Paystack.xcworkspace + IDESourceControlProjectRelativeInstallPathDictionary + + A5C151FC3F18980DA2906AAA3DE9140767EF2310 + .. + D0DC6CE0350266C4AFFCC35DA49B75AE57E8D73E + ../Example/PaymentKit + + IDESourceControlProjectURL + ssh://github.com/stripe/stripe-ios.git + IDESourceControlProjectVersion + 111 + IDESourceControlProjectWCCIdentifier + A5C151FC3F18980DA2906AAA3DE9140767EF2310 + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + D0DC6CE0350266C4AFFCC35DA49B75AE57E8D73E + IDESourceControlWCCName + PaymentKit + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + A5C151FC3F18980DA2906AAA3DE9140767EF2310 + IDESourceControlWCCName + stripe-ios + + + + diff --git a/Paystack/BuildConfigurations/PaystackOSX-Debug.xcconfig b/Paystack/BuildConfigurations/PaystackOSX-Debug.xcconfig new file mode 100644 index 0000000..5556711 --- /dev/null +++ b/Paystack/BuildConfigurations/PaystackOSX-Debug.xcconfig @@ -0,0 +1,11 @@ +// +// PaystackOSX-Debug.xcconfig +// +// Generated by BuildSettingExtractor on 4/27/15 +// https://github.com/dempseyatgithub/BuildSettingExtractor +// + +#include "PaystackOSX-Shared.xcconfig" + + +GCC_PREPROCESSOR_DEFINITIONS = DEBUG=1 $(inherited) \ No newline at end of file diff --git a/Paystack/BuildConfigurations/PaystackOSX-Release.xcconfig b/Paystack/BuildConfigurations/PaystackOSX-Release.xcconfig new file mode 100644 index 0000000..48f2d46 --- /dev/null +++ b/Paystack/BuildConfigurations/PaystackOSX-Release.xcconfig @@ -0,0 +1,22 @@ +// +// PaystackOSX-Release.xcconfig +// +// Generated by BuildSettingExtractor on 4/27/15 +// https://github.com/dempseyatgithub/BuildSettingExtractor +// + +#include "PaystackOSX-Shared.xcconfig" + + +// Debug Information Format +// +// This setting controls the format of debug information used by the developer tools. +// +// DWARF - Object files and linked products will use DWARF as the debug information +// format. [dwarf] +// DWARF with dSYM File - Object files and linked products will use DWARF as the debug +// information format, and Xcode will also produce a dSYM file containing the debug +// information from the individual object files (except that a dSYM file is not needed +// and will not be created for static library or object file products). [dwarf-with-dsym] + +DEBUG_INFORMATION_FORMAT = dwarf-with-dsym \ No newline at end of file diff --git a/Paystack/BuildConfigurations/PaystackOSX-Shared.xcconfig b/Paystack/BuildConfigurations/PaystackOSX-Shared.xcconfig new file mode 100644 index 0000000..130d777 --- /dev/null +++ b/Paystack/BuildConfigurations/PaystackOSX-Shared.xcconfig @@ -0,0 +1,186 @@ +// +// PaystackOSX-Shared.xcconfig +// +// Generated by BuildSettingExtractor on 4/27/15 +// https://github.com/dempseyatgithub/BuildSettingExtractor +// + + +CLANG_CXX_LANGUAGE_STANDARD = gnu++0x + + +CLANG_CXX_LIBRARY = libc++ + + +CLANG_ENABLE_MODULES = YES + + +CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR + + +CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR + + +// Combine High Resolution Artwork +// +// Combines image files at different resolutions into one multi-page TIFF file that is +// HiDPI compliant for Mac OS X 10.7 and later. Only image files in the same directory +// and with the same base name and extension are combined. The file names must conform to +// the naming convention used in HiDPI. + +COMBINE_HIDPI_IMAGES = YES + + +// Current Project Version +// +// This setting defines the the current version of the project. The value must be a +// integer or floating point number like 57 or 365.8. + +CURRENT_PROJECT_VERSION = 1 + + +// Defines Module +// +// If enabled, the product will be treated as defining its own module. This enables +// automatic production of LLVM module map files when appropriate, and allows the product +// to be imported as a module. + +DEFINES_MODULE = YES + +MODULEMAP_FILE = Paystack/module.modulemap + + +// Compatibility Version +// +// Determines the compatibility version of the resulting library, bundle, or framework +// binary. + +DYLIB_COMPATIBILITY_VERSION = 1 + + +// Current Library Version +// +// This setting defines the the current version of any framework built by the project. +// Like "Current Project Version", the value must be an integer or floating point number +// like 57 or 365.8. By default it is set to $(CURRENT_PROJECT_VERSION). + +DYLIB_CURRENT_VERSION = 1 + + +// Dynamic Library Install Name Base +// +// Sets the base value for the internal "install path" (LC_ID_DYLIB) in a dynamic +// library. This will be combined with the EXECUTABLE_PATH to form the full install path. +// Setting LD_DYLIB_INSTALL_NAME directly will override this setting. This setting +// defaults to the target's INSTALL_PATH. It is ignored when building any product other +// than a dynamic library. [-install_name] + +DYLIB_INSTALL_NAME_BASE = @rpath + + +// Framework Version +// +// Framework bundles are versioned by having contents in subfolders of a version folder +// that has links to the current version and its contents. + +FRAMEWORK_VERSION = A + + +GCC_TREAT_WARNINGS_AS_ERRORS = YES + + +GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR + + +GCC_WARN_SHADOW = YES + + +GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE + + +// Info.plist File +// +// This is the project-relative path to the plist file that contains the Info.plist +// information used by bundles. + +INFOPLIST_FILE = Paystack/Info.plist + + +// Installation Directory +// +// The directory to install the build products in. This path is prepended by the +// 'Installation Build Products Location' (i.e., $(DSTROOT)). + +INSTALL_PATH = $(LOCAL_LIBRARY_DIR)/Frameworks + + +// Runpath Search Paths +// +// This is a list of paths to be added to the runpath search path list for the image +// being created. At runtime, dyld uses the runpath when searching for dylibs whose load +// path begins with '@rpath/'. [-rpath] + +LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/../Frameworks @loader_path/Frameworks + + +// OS X Deployment Target +// +// Code will load on this and later versions of OS X. Framework APIs that are +// unavailable in earlier versions will be weak-linked; your code should check for null +// function pointers or specific system versions before calling newer APIs. +// +// Compiler Default - Code will load on any Mac OS system that supports the APIs that are +// used. +// OS X 10.4 - Code will not load on systems earlier than 10.4. [10.4] +// OS X 10.5 - Code will not load on systems earlier than 10.5. [10.5] +// OS X 10.6 - Code will not load on systems earlier than 10.6. [10.6] +// OS X 10.7 - Code will not load on systems earlier than 10.7. [10.7] +// OS X 10.8 - Code will not load on systems earlier than 10.8. [10.8] +// OS X 10.9 - Code will not load on systems earlier than 10.9. [10.9] + +MACOSX_DEPLOYMENT_TARGET = 10.9 + + +// Product Name +// +// This is the basename of the product generated. + +PRODUCT_NAME = PaystackOSX + + +// Base SDK +// +// The name or path of the base SDK being used during the build. The product will be +// built against the headers and libraries located inside the indicated SDK. This path +// will be prepended to all search paths, and will be passed through the environment to +// the compiler and linker. Additional SDKs can be specified in the ADDITIONAL_SDKS +// setting. + +SDKROOT = macosx + + +// Skip Install +// +// Activating this setting when deployment locations are used causes the product to be +// built into an alternative location instead of the install location. + +SKIP_INSTALL = YES + + +// Versioning Name Prefix +// +// Used as a prefix for the name of the version info symbol in the generated versioning +// source file. If you prefix your exported symbols you will probably want to set this +// to the same prefix. + +VERSION_INFO_PREFIX = + + +// Versioning System +// +// Selects the process used for version-stamping generated files. +// +// None - Use no versioning system. [] +// Apple Generic - Use the current project version setting. [apple-generic] + +VERSIONING_SYSTEM = apple-generic diff --git a/Paystack/BuildConfigurations/PaystackOSXTests-Debug.xcconfig b/Paystack/BuildConfigurations/PaystackOSXTests-Debug.xcconfig new file mode 100644 index 0000000..e6b6317 --- /dev/null +++ b/Paystack/BuildConfigurations/PaystackOSXTests-Debug.xcconfig @@ -0,0 +1,11 @@ +// +// PaystackOSXTests-Debug.xcconfig +// +// Generated by BuildSettingExtractor on 4/27/15 +// https://github.com/dempseyatgithub/BuildSettingExtractor +// + +#include "PaystackOSXTests-Shared.xcconfig" + + +GCC_PREPROCESSOR_DEFINITIONS = DEBUG=1 $(inherited) \ No newline at end of file diff --git a/Paystack/BuildConfigurations/PaystackOSXTests-Release.xcconfig b/Paystack/BuildConfigurations/PaystackOSXTests-Release.xcconfig new file mode 100644 index 0000000..afa8f3e --- /dev/null +++ b/Paystack/BuildConfigurations/PaystackOSXTests-Release.xcconfig @@ -0,0 +1,22 @@ +// +// PaystackOSXTests-Release.xcconfig +// +// Generated by BuildSettingExtractor on 4/27/15 +// https://github.com/dempseyatgithub/BuildSettingExtractor +// + +#include "PaystackOSXTests-Shared.xcconfig" + + +// Debug Information Format +// +// This setting controls the format of debug information used by the developer tools. +// +// DWARF - Object files and linked products will use DWARF as the debug information +// format. [dwarf] +// DWARF with dSYM File - Object files and linked products will use DWARF as the debug +// information format, and Xcode will also produce a dSYM file containing the debug +// information from the individual object files (except that a dSYM file is not needed +// and will not be created for static library or object file products). [dwarf-with-dsym] + +DEBUG_INFORMATION_FORMAT = dwarf-with-dsym diff --git a/Paystack/BuildConfigurations/PaystackOSXTests-Shared.xcconfig b/Paystack/BuildConfigurations/PaystackOSXTests-Shared.xcconfig new file mode 100644 index 0000000..dc3d9dd --- /dev/null +++ b/Paystack/BuildConfigurations/PaystackOSXTests-Shared.xcconfig @@ -0,0 +1,122 @@ +// +// PaystackOSXTests-Shared.xcconfig +// +// Generated by BuildSettingExtractor on 4/27/15 +// https://github.com/dempseyatgithub/BuildSettingExtractor +// + + +CLANG_CXX_LANGUAGE_STANDARD = gnu++0x + + + +CLANG_CXX_LIBRARY = libc++ + + + +CLANG_ENABLE_MODULES = YES + + + +CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR + + + +CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR + + + +// Combine High Resolution Artwork +// +// Combines image files at different resolutions into one multi-page TIFF file that is +// HiDPI compliant for Mac OS X 10.7 and later. Only image files in the same directory +// and with the same base name and extension are combined. The file names must conform to +// the naming convention used in HiDPI. + +COMBINE_HIDPI_IMAGES = YES + + + +// Framework Search Paths +// +// This is a list of paths to folders containing frameworks to be searched by the +// compiler for both included or imported header files when compiling C, Objective-C, +// C++, or Objective-C++, and by the linker for frameworks used by the product. Paths are +// delimited by whitespace, so any paths with spaces in them need to be properly quoted. +// [-F] + +FRAMEWORK_SEARCH_PATHS = $(DEVELOPER_FRAMEWORKS_DIR) $(inherited) + + + +GCC_TREAT_WARNINGS_AS_ERRORS = YES + + + +GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR + + + +GCC_WARN_SHADOW = YES + + + +GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE + + + +// Info.plist File +// +// This is the project-relative path to the plist file that contains the Info.plist +// information used by bundles. + +INFOPLIST_FILE = Tests/Tests/Info.plist + + + +// Runpath Search Paths +// +// This is a list of paths to be added to the runpath search path list for the image +// being created. At runtime, dyld uses the runpath when searching for dylibs whose load +// path begins with '@rpath/'. [-rpath] + +LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/../Frameworks @loader_path/../Frameworks + + + +// OS X Deployment Target +// +// Code will load on this and later versions of OS X. Framework APIs that are +// unavailable in earlier versions will be weak-linked; your code should check for null +// function pointers or specific system versions before calling newer APIs. +// +// Compiler Default - Code will load on any Mac OS system that supports the APIs that are +// used. +// OS X 10.4 - Code will not load on systems earlier than 10.4. [10.4] +// OS X 10.5 - Code will not load on systems earlier than 10.5. [10.5] +// OS X 10.6 - Code will not load on systems earlier than 10.6. [10.6] +// OS X 10.7 - Code will not load on systems earlier than 10.7. [10.7] +// OS X 10.8 - Code will not load on systems earlier than 10.8. [10.8] +// OS X 10.9 - Code will not load on systems earlier than 10.9. [10.9] + +MACOSX_DEPLOYMENT_TARGET = 10.10 + + + +// Product Name +// +// This is the basename of the product generated. + +PRODUCT_NAME = $(TARGET_NAME) + + + +// Base SDK +// +// The name or path of the base SDK being used during the build. The product will be +// built against the headers and libraries located inside the indicated SDK. This path +// will be prepended to all search paths, and will be passed through the environment to +// the compiler and linker. Additional SDKs can be specified in the ADDITIONAL_SDKS +// setting. + +SDKROOT = macosx \ No newline at end of file diff --git a/Paystack/BuildConfigurations/PaystackiOS Tests-Debug.xcconfig b/Paystack/BuildConfigurations/PaystackiOS Tests-Debug.xcconfig new file mode 100644 index 0000000..bdd1b63 --- /dev/null +++ b/Paystack/BuildConfigurations/PaystackiOS Tests-Debug.xcconfig @@ -0,0 +1,11 @@ +// +// PaystackiOS Tests-Debug.xcconfig +// +// Generated by BuildSettingExtractor on 4/27/15 +// https://github.com/dempseyatgithub/BuildSettingExtractor +// + +#include "PaystackiOS Tests-Shared.xcconfig" + +GCC_PREPROCESSOR_DEFINITIONS = DEBUG=1 $(inherited) +DEBUG_INFORMATION_FORMAT = dwarf diff --git a/Paystack/BuildConfigurations/PaystackiOS Tests-Release.xcconfig b/Paystack/BuildConfigurations/PaystackiOS Tests-Release.xcconfig new file mode 100644 index 0000000..f29f324 --- /dev/null +++ b/Paystack/BuildConfigurations/PaystackiOS Tests-Release.xcconfig @@ -0,0 +1,12 @@ +// +// PaystackiOS Tests-Release.xcconfig +// +// Generated by BuildSettingExtractor on 4/27/15 +// https://github.com/dempseyatgithub/BuildSettingExtractor +// + +#include "PaystackiOS Tests-Shared.xcconfig" + +//********************************************// +//* Currently no build settings in this file *// +//********************************************// diff --git a/Paystack/BuildConfigurations/PaystackiOS Tests-Shared.xcconfig b/Paystack/BuildConfigurations/PaystackiOS Tests-Shared.xcconfig new file mode 100644 index 0000000..c2b1731 --- /dev/null +++ b/Paystack/BuildConfigurations/PaystackiOS Tests-Shared.xcconfig @@ -0,0 +1,92 @@ +// +// PaystackiOS Tests-Shared.xcconfig +// +// Generated by BuildSettingExtractor on 4/27/15 +// https://github.com/dempseyatgithub/BuildSettingExtractor +// + + +CLANG_CXX_LANGUAGE_STANDARD = gnu++0x + + +CLANG_CXX_LIBRARY = libc++ + + +CLANG_ENABLE_MODULES = YES + + +CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR + + +CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR + + +IPHONEOS_DEPLOYMENT_TARGET = 8.0 + + +// Code Signing Identity +// +// The name ("common name") of a valid code-signing certificate in a keychain within your +// keychain path. A missing or invalid certificate will cause a build error. + +CODE_SIGN_IDENTITY = iPhone Developer + + +// Framework Search Paths +// +// This is a list of paths to folders containing frameworks to be searched by the +// compiler for both included or imported header files when compiling C, Objective-C, +// C++, or Objective-C++, and by the linker for frameworks used by the product. Paths are +// delimited by whitespace, so any paths with spaces in them need to be properly quoted. +// [-F] + +FRAMEWORK_SEARCH_PATHS = $(inherited) + + +GCC_TREAT_WARNINGS_AS_ERRORS = YES + + +GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR + + +GCC_WARN_SHADOW = YES + + +GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE + + +// Header Search Paths +// +// This is a list of paths to folders to be searched by the compiler for included or +// imported header files when compiling C, Objective-C, C++, or Objective-C++. Paths are +// delimited by whitespace, so any paths with spaces in them need to be properly quoted. +// [-I] + +HEADER_SEARCH_PATHS = $(inherited) + + +// Info.plist File +// +// This is the project-relative path to the plist file that contains the Info.plist +// information used by bundles. + +INFOPLIST_FILE = Tests/Tests/Info.plist + + +// Runpath Search Paths +// +// This is a list of paths to be added to the runpath search path list for the image +// being created. At runtime, dyld uses the runpath when searching for dylibs whose load +// path begins with '@rpath/'. [-rpath] + +LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/Frameworks @loader_path/Frameworks + + +OTHER_CFLAGS = + + +// Product Name +// +// This is the basename of the product generated. + +PRODUCT_NAME = $(TARGET_NAME) diff --git a/Paystack/BuildConfigurations/PaystackiOS-Debug.xcconfig b/Paystack/BuildConfigurations/PaystackiOS-Debug.xcconfig new file mode 100644 index 0000000..0aa4115 --- /dev/null +++ b/Paystack/BuildConfigurations/PaystackiOS-Debug.xcconfig @@ -0,0 +1,11 @@ +// +// PaystackiOS-Debug.xcconfig +// +// Generated by BuildSettingExtractor on 4/27/15 +// https://github.com/dempseyatgithub/BuildSettingExtractor +// + +#include "PaystackiOS-Shared.xcconfig" + + +GCC_PREPROCESSOR_DEFINITIONS = DEBUG=1 $(inherited) diff --git a/Paystack/BuildConfigurations/PaystackiOS-Release.xcconfig b/Paystack/BuildConfigurations/PaystackiOS-Release.xcconfig new file mode 100644 index 0000000..06440f6 --- /dev/null +++ b/Paystack/BuildConfigurations/PaystackiOS-Release.xcconfig @@ -0,0 +1,10 @@ +// +// PaystackiOS-Release.xcconfig +// +// Generated by BuildSettingExtractor on 4/27/15 +// https://github.com/dempseyatgithub/BuildSettingExtractor +// + +#include "PaystackiOS-Shared.xcconfig" + +ENABLE_NS_ASSERTIONS = YES diff --git a/Paystack/BuildConfigurations/PaystackiOS-Shared.xcconfig b/Paystack/BuildConfigurations/PaystackiOS-Shared.xcconfig new file mode 100644 index 0000000..da2d697 --- /dev/null +++ b/Paystack/BuildConfigurations/PaystackiOS-Shared.xcconfig @@ -0,0 +1,167 @@ +// +// PaystackiOS-Shared.xcconfig +// +// Generated by BuildSettingExtractor on 4/27/15 +// https://github.com/dempseyatgithub/BuildSettingExtractor +// + + +CLANG_CXX_LANGUAGE_STANDARD = gnu++0x + + +CLANG_CXX_LIBRARY = libc++ + + +CLANG_ENABLE_MODULES = YES + + +CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR + + +CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR + + +// Code Signing Identity +// +// The name ("common name") of a valid code-signing certificate in a keychain within your +// keychain path. A missing or invalid certificate will cause a build error. + +CODE_SIGN_IDENTITY[sdk=iphoneos*] = iPhone Developer + + +// Current Project Version +// +// This setting defines the the current version of the project. The value must be a +// integer or floating point number like 57 or 365.8. + +CURRENT_PROJECT_VERSION = 1 + + +// Defines Module +// +// If enabled, the product will be treated as defining its own module. This enables +// automatic production of LLVM module map files when appropriate, and allows the product +// to be imported as a module. + +DEFINES_MODULE = YES + + +// Compatibility Version +// +// Determines the compatibility version of the resulting library, bundle, or framework +// binary. + +DYLIB_COMPATIBILITY_VERSION = 1 + + +// Current Library Version +// +// This setting defines the the current version of any framework built by the project. +// Like "Current Project Version", the value must be an integer or floating point number +// like 57 or 365.8. By default it is set to $(CURRENT_PROJECT_VERSION). + +DYLIB_CURRENT_VERSION = 1 + + +// Dynamic Library Install Name Base +// +// Sets the base value for the internal "install path" (LC_ID_DYLIB) in a dynamic +// library. This will be combined with the EXECUTABLE_PATH to form the full install path. +// Setting LD_DYLIB_INSTALL_NAME directly will override this setting. This setting +// defaults to the target's INSTALL_PATH. It is ignored when building any product other +// than a dynamic library. [-install_name] + +DYLIB_INSTALL_NAME_BASE = @rpath + + +GCC_TREAT_WARNINGS_AS_ERRORS = YES + + +GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR + + +GCC_WARN_SHADOW = YES + + +GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE + + +// Info.plist File +// +// This is the project-relative path to the plist file that contains the Info.plist +// information used by bundles. + +INFOPLIST_FILE = Paystack/Info.plist + + +// Installation Directory +// +// The directory to install the build products in. This path is prepended by the +// 'Installation Build Products Location' (i.e., $(DSTROOT)). + +INSTALL_PATH = $(LOCAL_LIBRARY_DIR)/Frameworks + + +// iOS Deployment Target +// +// Code will load on this and later versions of iOS. Framework APIs that are unavailable +// in earlier versions will be weak-linked; your code should check for null function +// pointers or specific system versions before calling newer APIs. +// + +IPHONEOS_DEPLOYMENT_TARGET = 8.0 + + +// Runpath Search Paths +// +// This is a list of paths to be added to the runpath search path list for the image +// being created. At runtime, dyld uses the runpath when searching for dylibs whose load +// path begins with '@rpath/'. [-rpath] + +LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/Frameworks @loader_path/Frameworks + + +// Product Name +// +// This is the basename of the product generated. + +PRODUCT_NAME = Paystack + + +// Skip Install +// +// Activating this setting when deployment locations are used causes the product to be +// built into an alternative location instead of the install location. + +SKIP_INSTALL = YES + + +// Targeted Device Family +// +// The build system uses the selected device to set the correct value for the +// UIDeviceFamily key it adds to the target's Info.plist file. +// +// iPhone - Application is built for iPhone and iPod touch. +// iPad - Application is built for iPad. +// iPhone/iPad - Application is built Universal for iPhone, iPod touch, and iPad. + +TARGETED_DEVICE_FAMILY = 1,2 + + +// Versioning Name Prefix +// +// Used as a prefix for the name of the version info symbol in the generated versioning +// source file. If you prefix your exported symbols you will probably want to set this +// to the same prefix. + +VERSION_INFO_PREFIX = + + +// Versioning System +// +// Selects the process used for version-stamping generated files. +// +// None - Use no versioning system. [] +// Apple Generic - Use the current project version setting. [apple-generic] + +VERSIONING_SYSTEM = apple-generic diff --git a/Paystack/BuildConfigurations/PaystackiOSStatic.xcconfig b/Paystack/BuildConfigurations/PaystackiOSStatic.xcconfig new file mode 100644 index 0000000..6f61b69 --- /dev/null +++ b/Paystack/BuildConfigurations/PaystackiOSStatic.xcconfig @@ -0,0 +1,99 @@ +// +// PaystackiOSStatic-Shared.xcconfig +// +// Generated by BuildSettingExtractor on 4/27/15 +// https://github.com/dempseyatgithub/BuildSettingExtractor +// + +// Strip Debug Symbols During Copy +// +// Activating this setting causes binary files which are copied during the build (e.g., +// in a Copy Bundle Resources or Copy Files build phase) to be stripped of debugging +// symbols. It does not cause the linked product of a target to be stripped (use Strip +// Linked Product for that). + +COPY_PHASE_STRIP = NO + +CLANG_CXX_LANGUAGE_STANDARD = gnu++0x + + +CLANG_CXX_LIBRARY = libc++ + + +CLANG_ENABLE_MODULES = YES + + +CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR + + +CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR + + +// Dead Code Stripping +// +// Activating this setting causes the -dead_strip flag to be passed to ld(1) via cc(1) to +// turn on dead code stripping. If this option is selected, -gfull (not -gused) must be +// used to generate debugging symbols in order to have them correctly stripped. +// [-dead_strip] + +DEAD_CODE_STRIPPING = NO + + +GCC_TREAT_WARNINGS_AS_ERRORS = YES + + +GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR + + +GCC_WARN_SHADOW = YES + + +GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE + +PSTCK_EXTRA_PREPROCESSOR_MACROS = PSTCK_STATIC_LIBRARY_BUILD + +// iOS Deployment Target +// +// Code will load on this and later versions of iOS. Framework APIs that are unavailable +// in earlier versions will be weak-linked; your code should check for null function +// pointers or specific system versions before calling newer APIs. +// + +IPHONEOS_DEPLOYMENT_TARGET = 7.0 + + +// Other Linker Flags +// +// Options defined in this setting are passed to invocations of the linker. + +OTHER_LDFLAGS = -ObjC + + +// Product Name +// +// This is the basename of the product generated. + +PRODUCT_NAME = Paystack + + +// Skip Install +// +// Activating this setting when deployment locations are used causes the product to be +// built into an alternative location instead of the install location. + +SKIP_INSTALL = YES + + +// Strip Style +// +// Defines the level of symbol stripping to be performed on the linked product of the +// build. The default value is defined by the target's product type. +// +// All Symbols - Completely strips the binary, removing the symbol table and relocation +// information. [all, -s] +// Non-Global Symbols - Strips non-global symbols, but saves external symbols. +// [non-global, -x] +// Debugging Symbols - Strips debugging symbols, but saves local and global symbols. +// [debugging, -S] + +STRIP_STYLE = non-global diff --git a/Paystack/BuildConfigurations/PaystackiOSStaticFramework.xcconfig b/Paystack/BuildConfigurations/PaystackiOSStaticFramework.xcconfig new file mode 100644 index 0000000..a7c222c --- /dev/null +++ b/Paystack/BuildConfigurations/PaystackiOSStaticFramework.xcconfig @@ -0,0 +1,19 @@ +// +// PaystackiOSStaticFramework-Shared.xcconfig +// +// Generated by BuildSettingExtractor on 4/27/15 +// https://github.com/dempseyatgithub/BuildSettingExtractor +// + + +GCC_TREAT_WARNINGS_AS_ERRORS = YES + + +GCC_WARN_SHADOW = YES + + +// Product Name +// +// This is the basename of the product generated. + +PRODUCT_NAME = $(TARGET_NAME) diff --git a/Paystack/BuildConfigurations/Project-Debug.xcconfig b/Paystack/BuildConfigurations/Project-Debug.xcconfig new file mode 100644 index 0000000..919c77d --- /dev/null +++ b/Paystack/BuildConfigurations/Project-Debug.xcconfig @@ -0,0 +1,48 @@ +// +// Project-Debug.xcconfig +// +// Generated by BuildSettingExtractor on 4/27/15 +// https://github.com/dempseyatgithub/BuildSettingExtractor +// + +#include "Project-Shared.xcconfig" + + +// Strip Debug Symbols During Copy +// +// Activating this setting causes binary files which are copied during the build (e.g., +// in a Copy Bundle Resources or Copy Files build phase) to be stripped of debugging +// symbols. It does not cause the linked product of a target to be stripped (use Strip +// Linked Product for that). + +COPY_PHASE_STRIP = NO + + +GCC_DYNAMIC_NO_PIC = NO + + +GCC_OPTIMIZATION_LEVEL = 0 + + +PSTCK_EXTRA_PREPROCESSOR_MACROS= +GCC_PREPROCESSOR_DEFINITIONS = DEBUG=1 $(inherited) $(PSTCK_EXTRA_PREPROCESSOR_MACROS) + + +GCC_SYMBOLS_PRIVATE_EXTERN = NO + + +// Build Active Architecture Only +// +// When checked, only the active architecture is built for faster debugging turnaround + +ONLY_ACTIVE_ARCH = YES + +// iOS Deployment Target +// +// Code will load on this and later versions of iOS. Framework APIs that are unavailable +// in earlier versions will be weak-linked; your code should check for null function +// pointers or specific system versions before calling newer APIs. + +IPHONEOS_DEPLOYMENT_TARGET = 7.0 + +ENABLE_TESTABILITY = YES diff --git a/Paystack/BuildConfigurations/Project-Release.xcconfig b/Paystack/BuildConfigurations/Project-Release.xcconfig new file mode 100644 index 0000000..483967d --- /dev/null +++ b/Paystack/BuildConfigurations/Project-Release.xcconfig @@ -0,0 +1,41 @@ +// +// Project-Release.xcconfig +// +// Generated by BuildSettingExtractor on 4/27/15 +// https://github.com/dempseyatgithub/BuildSettingExtractor +// + +#include "Project-Shared.xcconfig" + + +// Strip Debug Symbols During Copy +// +// Activating this setting causes binary files which are copied during the build (e.g., +// in a Copy Bundle Resources or Copy Files build phase) to be stripped of debugging +// symbols. It does not cause the linked product of a target to be stripped (use Strip +// Linked Product for that). + +COPY_PHASE_STRIP = YES + + +ENABLE_NS_ASSERTIONS = NO + +PSTCK_EXTRA_PREPROCESSOR_MACROS= +GCC_PREPROCESSOR_DEFINITIONS = NDEBUG $(PSTCK_EXTRA_PREPROCESSOR_MACROS) + + +// Validate Built Product +// +// Activating this setting will cause Xcode to perform validation checks on the product +// as part of the build process. + +VALIDATE_PRODUCT = YES + +// iOS Deployment Target +// +// Code will load on this and later versions of iOS. Framework APIs that are unavailable +// in earlier versions will be weak-linked; your code should check for null function +// pointers or specific system versions before calling newer APIs. +// + +IPHONEOS_DEPLOYMENT_TARGET = 8.0 diff --git a/Paystack/BuildConfigurations/Project-Shared.xcconfig b/Paystack/BuildConfigurations/Project-Shared.xcconfig new file mode 100644 index 0000000..39bbea8 --- /dev/null +++ b/Paystack/BuildConfigurations/Project-Shared.xcconfig @@ -0,0 +1,130 @@ +// +// Project-Shared.xcconfig +// +// Generated by BuildSettingExtractor on 4/27/15 +// https://github.com/dempseyatgithub/BuildSettingExtractor +// + + +// Always Search User Paths +// +// If enabled both #include -style and #include "header.h"-style directives +// will search the paths in "User Header Search Paths" before "Header Search Paths", with +// the consequence that user headers (such as your own String.h header) would have +// precedence over system headers when using #include . This is done using the +// -iquote flag for the paths provided in "User Header Search Paths". If disabled and +// your compiler fully supports separate user paths, user headers will only be accessible +// with #include "header.h"-style preprocessor directives. +// +// For backwards compatibility reasons, this setting is enabled by default, but disabling +// it is strongly recommended. + +ALWAYS_SEARCH_USER_PATHS = NO + + +CLANG_ENABLE_OBJC_ARC = YES + + +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES + + +CLANG_WARN_BOOL_CONVERSION = YES + + +CLANG_WARN_CONSTANT_CONVERSION = YES + + +CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES + + +CLANG_WARN_EMPTY_BODY = YES + + +CLANG_WARN_ENUM_CONVERSION = YES + + +CLANG_WARN_INT_CONVERSION = YES + + +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES + + +CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = YES + + +CLANG_WARN_UNREACHABLE_CODE = YES + + +ENABLE_STRICT_OBJC_MSGSEND = YES + + +GCC_C_LANGUAGE_STANDARD = gnu99 + + +// Compiler for C/C++/Objective-C +// +// The compiler to use for C, C++, and Objective-C. + +GCC_VERSION = com.apple.compilers.llvm.clang.1_0 + + +GCC_WARN_64_TO_32_BIT_CONVERSION = YES + + +GCC_WARN_ABOUT_MISSING_NEWLINE = YES + + +GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES + + +GCC_WARN_ABOUT_RETURN_TYPE = YES + + +GCC_WARN_SIGN_COMPARE = YES + + +GCC_WARN_UNDECLARED_SELECTOR = YES + + +GCC_WARN_UNINITIALIZED_AUTOS = YES + + +GCC_WARN_UNUSED_FUNCTION = YES + + +GCC_WARN_UNUSED_VARIABLE = YES + + +GCC_NO_COMMON_BLOCKS = YES; + +// Precompiled Header Uses Files From Build Directory +// +// This setting allows for better control of sharing precompiled prefix header files +// between projects. By default, Xcode assumes that the prefix header file may include +// header files from the build directory if the build directory is outside of the project +// directory. (Xcode cannot determine this ahead of time since other projects may not +// have been built into the shared build directory at the time the information is +// needed.) +// +// If your prefix file never includes files from the build directory you may set this to +// "NO" to improve sharing of precompiled headers. If the prefix does use files from a +// build directory which is inside your project directory, you may set this to "YES" to +// avoid unintended sharing that may result in build failures. + +PRECOMPS_INCLUDE_HEADERS_FROM_BUILT_PRODUCTS_DIR = NO + + +// Base SDK +// +// The name or path of the base SDK being used during the build. The product will be +// built against the headers and libraries located inside the indicated SDK. This path +// will be prepended to all search paths, and will be passed through the environment to +// the compiler and linker. Additional SDKs can be specified in the ADDITIONAL_SDKS +// setting. + +SDKROOT = iphoneos + + +WARNING_CFLAGS = -Wall -Wextra -Wundef -Wfloat-equal + +PRODUCT_BUNDLE_IDENTIFIER = com.paystack.$(PRODUCT_NAME:rfc1034identifier) diff --git a/Paystack/Fabric/FABKitProtocol.h b/Paystack/Fabric/FABKitProtocol.h new file mode 100644 index 0000000..53e0656 --- /dev/null +++ b/Paystack/Fabric/FABKitProtocol.h @@ -0,0 +1,46 @@ +// +// FABKitProtocol.h +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import + +/** + * Protocol that a class in a Fabric Kit must conform to to provide information to Fabric at runtime. + */ +@protocol FABKit + +@required + +/** + * Required. The globally unique identifier of the Kit. + * We encourage the use of reverse-DNS notation. + * Example: @"io.fabric.sdk.ios" + */ ++ (NSString *)bundleIdentifier; + +/** + * Required. Must return the current version of the Kit that is being used at runtime. + * We encourage the use of semantic versioning (http://semver.org/), without prefixing the version with a "v". + * This is commonly referred to as the "marketing version". + * Example: @"1.2.3" + */ ++ (NSString *)kitDisplayVersion; + +@optional + +/** + * The build version of the kit. Should be monotonically increasing and unique. + * Example: 137 + */ ++ (NSString *)kitBuildVersion; + +/** + * Perform any necessary initialization. + * This method will be invoked on the Kit when the user calls +[Fabric initializeKits]. + * @note This method being called does not necessarily imply that the developer has started using the Kit yet. + */ ++ (void)initializeIfNeeded; + +@end diff --git a/Paystack/Fabric/Fabric+FABKits.h b/Paystack/Fabric/Fabric+FABKits.h new file mode 100644 index 0000000..927e4da --- /dev/null +++ b/Paystack/Fabric/Fabric+FABKits.h @@ -0,0 +1,25 @@ +// +// Fabric+FABKits.h +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import "Fabric.h" + +@protocol FABKit; +// Use this category for methods that kits can call on Fabric. +@interface Fabric (FABKits) + +/** + * Returns a dictionary containing the kit configuration info for the provided kit. + * The configuration information is parsed from the application's Info.plist. This + * method is primarily intended to be used by kits to retrieve their configuration. + * + * @param kitClass The class of the kit whose configuration should be returned. + * It should conform to the FABKit protocol. + * + * @return A dictionary containing kit specific configuration information or nil if none exists. + */ ++ (nonnull NSDictionary *)configurationDictionaryForKitClass:(nonnull Class)kitClass; + +@end diff --git a/Paystack/Fabric/Fabric.h b/Paystack/Fabric/Fabric.h new file mode 100644 index 0000000..760aa76 --- /dev/null +++ b/Paystack/Fabric/Fabric.h @@ -0,0 +1,53 @@ +// +// Fabric.h +// +// Copyright (c) 2015 Twitter. All rights reserved. +// + +#import + +NS_ASSUME_NONNULL_BEGIN + +/** + * Fabric Base. Coordinates configuration and starts all provided kits. + */ +@interface Fabric : NSObject + +/** + * Initialize Fabric and all provided kits. Call this method within your App Delegate's `application:didFinishLaunchingWithOptions:` and provide the kits you wish to use. + * + * For example, in Objective-C: + * + * `[Fabric with:@[[Crashlytics class], [Twitter class], [Digits class], [MoPub class]]];` + * + * Swift: + * + * `Fabric.with([Crashlytics.self(), Twitter.self(), Digits.self(), MoPub.self()])` + * + * Only the first call to this method is honored. Subsequent calls are no-ops. + * + * @param kits An array of kit Class objects + * + * @return Returns the shared Fabric instance. In most cases this can be ignored. + */ ++ (instancetype)with:(NSArray *)kitClasses; + +/** + * Returns the Fabric singleton object. + */ ++ (instancetype)sharedSDK; + +/** + * This BOOL enables or disables debug logging, such as kit version information. The default value is NO. + */ +@property (nonatomic, assign) BOOL debug; + +/** + * Unavailable. Use `+sharedSDK` to retrieve the shared Fabric instance. + */ +- (id)init __attribute__((unavailable("Use +sharedSDK to retrieve the shared Fabric instance."))); + +@end + +NS_ASSUME_NONNULL_END + diff --git a/Paystack/Info.plist b/Paystack/Info.plist new file mode 100644 index 0000000..6d93915 --- /dev/null +++ b/Paystack/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + Paystack + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + NSPrincipalClass + + + diff --git a/Paystack/NSDictionary+Paystack.h b/Paystack/NSDictionary+Paystack.h new file mode 100644 index 0000000..7661e7a --- /dev/null +++ b/Paystack/NSDictionary+Paystack.h @@ -0,0 +1,14 @@ +// +// NSDictionary+Paystack.h +// Paystack +// + +#import + +@interface NSDictionary (Paystack) + +- (nullable NSDictionary *)pstck_dictionaryByRemovingNullsValidatingRequiredFields:(nonnull NSArray *)requiredFields; + +@end + +void linkDictionaryCategory(void); diff --git a/Paystack/NSDictionary+Paystack.m b/Paystack/NSDictionary+Paystack.m new file mode 100644 index 0000000..bd407bd --- /dev/null +++ b/Paystack/NSDictionary+Paystack.m @@ -0,0 +1,27 @@ +// +// NSDictionary+Paystack.m +// Paystack +// + +#import "NSDictionary+Paystack.h" + +@implementation NSDictionary (Paystack) + +- (nullable NSDictionary *)pstck_dictionaryByRemovingNullsValidatingRequiredFields:(nonnull NSArray *)requiredFields { + NSMutableDictionary *dict = [NSMutableDictionary dictionary]; + [self enumerateKeysAndObjectsUsingBlock:^(id key, id obj, __unused BOOL *stop) { + if (obj != [NSNull null]) { + dict[key] = obj; + } + }]; + for (NSString *key in requiredFields) { + if (![[dict allKeys] containsObject:key]) { + return nil; + } + } + return [dict copy]; +} + +@end + +void linkDictionaryCategory(void){} diff --git a/Paystack/PSTCKAPIClient+Private.h b/Paystack/PSTCKAPIClient+Private.h new file mode 100644 index 0000000..4d87339 --- /dev/null +++ b/Paystack/PSTCKAPIClient+Private.h @@ -0,0 +1,16 @@ +// +// PSTCKAPIClient+Private.h +// Paystack +// +// Copyright © 2016 Paystack, Inc. +// + +#import + +@interface PSTCKAPIClient () + +- (void)createTokenWithData:(nonnull NSData *)data completion:(nullable PSTCKTokenCompletionBlock)completion; + +@property (nonatomic, readwrite, nonnull) NSURL *apiURL; +@property (nonatomic, readwrite, nonnull) NSURLSession *urlSession; +@end diff --git a/Paystack/PSTCKAPIClient.m b/Paystack/PSTCKAPIClient.m new file mode 100644 index 0000000..3212bdd --- /dev/null +++ b/Paystack/PSTCKAPIClient.m @@ -0,0 +1,240 @@ +// +// PSTCKAPIClient.m +// PaystackExample +// + +#import "TargetConditionals.h" +#if TARGET_OS_IPHONE +#import +#import +#endif + +#import "PSTCKAPIClient.h" +#import "PSTCKFormEncoder.h" +#import "PSTCKCard.h" +#import "PSTCKToken.h" +#import "PaystackError.h" +#import "PSTCKAPIResponseDecodable.h" +#import "PSTCKAPIPostRequest.h" + +#if __has_include("Fabric.h") +#import "Fabric+FABKits.h" +#import "FABKitProtocol.h" +#endif + +#ifdef PSTCK_STATIC_LIBRARY_BUILD +#import "PSTCKCategoryLoader.h" +#endif + +#define FAUXPAS_IGNORED_IN_METHOD(...) + +static NSString *const apiURLBase = @"standard.paystack.co/bosco"; +static NSString *const tokenEndpoint = @"createmobiletoken"; +static NSString *const paystackAPIVersion = @"2016-02-12"; +static NSString *PSTCKDefaultPublishableKey; + +@implementation Paystack + ++ (void)setDefaultPublishableKey:(NSString *)publishableKey { + PSTCKDefaultPublishableKey = publishableKey; +} + ++ (NSString *)defaultPublishableKey { + return PSTCKDefaultPublishableKey; +} + +@end + +#if __has_include("Fabric.h") +@interface PSTCKAPIClient () +#else +@interface PSTCKAPIClient() +#endif +@property (nonatomic, readwrite) NSURL *apiURL; +@property (nonatomic, readwrite) NSURLSession *urlSession; +@end + +@implementation PSTCKAPIClient + +#ifdef PSTCK_STATIC_LIBRARY_BUILD ++ (void)initialize { + [PSTCKCategoryLoader loadCategories]; +} +#endif + ++ (instancetype)sharedClient { + static id sharedClient; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ sharedClient = [[self alloc] init]; }); + return sharedClient; +} + +- (instancetype)init { + return [self initWithPublishableKey:[Paystack defaultPublishableKey]]; +} + +- (instancetype)initWithPublishableKey:(NSString *)publishableKey { + self = [super init]; + if (self) { + [self.class validateKey:publishableKey]; + _apiURL = [NSURL URLWithString:[NSString stringWithFormat:@"https://%@", apiURLBase]]; + _publishableKey = [publishableKey copy]; + _operationQueue = [NSOperationQueue mainQueue]; + NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; + NSString *auth = [@"Bearer " stringByAppendingString:self.publishableKey]; + config.HTTPAdditionalHeaders = @{ + @"X-Paystack-User-Agent": [self.class paystackUserAgentDetails], + @"Paystack-Version": paystackAPIVersion, + @"Authorization": auth, + }; + _urlSession = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:_operationQueue]; + } + return self; +} + + + +- (void)setOperationQueue:(NSOperationQueue *)operationQueue { + NSCAssert(operationQueue, @"Operation queue cannot be nil."); + _operationQueue = operationQueue; +} + +- (void)createTokenWithData:(NSData *)data completion:(PSTCKTokenCompletionBlock)completion { + NSCAssert(data != nil, @"'data' is required to create a token"); + NSCAssert(completion != nil, @"'completion' is required to use the token that is created"); + [PSTCKAPIPostRequest startWithAPIClient:self + endpoint:tokenEndpoint + postData:data + serializer:[PSTCKToken new] + completion:completion]; +} + +#pragma mark - private helpers + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wunused-variable" ++ (void)validateKey:(NSString *)publishableKey { + NSCAssert(publishableKey != nil && ![publishableKey isEqualToString:@""], + @"You must use a valid publishable key to create a token."); + BOOL secretKey = [publishableKey hasPrefix:@"sk_"]; + NSCAssert(!secretKey, + @"You are using a secret key to create a token, instead of the publishable one."); +#ifndef DEBUG + if ([publishableKey.lowercaseString hasPrefix:@"pk_test"]) { + FAUXPAS_IGNORED_IN_METHOD(NSLogUsed); + NSLog(@"⚠️ Warning! You're building your app in a non-debug configuration, but appear to be using your Paystack test key. Make sure not to submit to " + @"the App Store with your test keys!⚠️"); + } +#endif +} +#pragma clang diagnostic pop + +#pragma mark Utility methods - + ++ (NSString *)paystackUserAgentDetails { + NSMutableDictionary *details = [@{ + @"lang": @"objective-c", + @"bindings_version": PSTCKSDKVersion, + } mutableCopy]; +#if TARGET_OS_IPHONE + NSString *version = [UIDevice currentDevice].systemVersion; + if (version) { + details[@"os_version"] = version; + } + struct utsname systemInfo; + uname(&systemInfo); + NSString *deviceType = @(systemInfo.machine); + if (deviceType) { + details[@"type"] = deviceType; + } + NSString *model = [UIDevice currentDevice].localizedModel; + if (model) { + details[@"model"] = model; + } + if ([[UIDevice currentDevice] respondsToSelector:@selector(identifierForVendor)]) { + NSString *vendorIdentifier = [[[UIDevice currentDevice] performSelector:@selector(identifierForVendor)] performSelector:@selector(UUIDString)]; + if (vendorIdentifier) { + details[@"vendor_identifier"] = vendorIdentifier; + } + } +#endif + return [[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:[details copy] options:0 error:NULL] encoding:NSUTF8StringEncoding]; +} + +#pragma mark Fabric +#if __has_include("Fabric.h") + ++ (NSString *)bundleIdentifier { + return @"com.paystack.paystack-ios"; +} + ++ (NSString *)kitDisplayVersion { + return PSTCKSDKVersion; +} + ++ (void)initializeIfNeeded { + Class fabric = NSClassFromString(@"Fabric"); + if (fabric) { + // The app must be using Fabric, as it exists at runtime. We fetch our default publishable key from Fabric. + NSDictionary *fabricConfiguration = [fabric configurationDictionaryForKitClass:[PSTCKAPIClient class]]; + NSString *publishableKey = fabricConfiguration[@"publishable"]; + if (!publishableKey) { + NSLog(@"Configuration dictionary returned by Fabric was nil, or doesn't have publishableKey. Can't initialize Paystack."); + return; + } + [self validateKey:publishableKey]; + [Paystack setDefaultPublishableKey:publishableKey]; + } else { + NSCAssert(fabric, @"initializeIfNeeded method called from a project that doesn't have Fabric."); + } +} + +#endif + +@end + +#pragma mark - Credit Cards +@implementation PSTCKAPIClient (CreditCards) + +- (void)createTokenWithCard:(PSTCKCard *)card completion:(PSTCKTokenCompletionBlock)completion { +// NSData *data = [PSTCKFormEncoder formEncodedDataForObject:card]; + NSData *data = [PSTCKFormEncoder formEncryptedDataForCard:card]; + + [self createTokenWithData:data completion:completion]; +} + +@end + +@implementation Paystack (Deprecated) + ++ (id)alloc { + NSCAssert(NO, @"'Paystack' is a static class and cannot be instantiated."); + return nil; +} + ++ (void)createTokenWithCard:(PSTCKCard *)card + publishableKey:(NSString *)publishableKey + operationQueue:(NSOperationQueue *)queue + completion:(PSTCKCompletionBlock)handler { + NSCAssert(card != nil, @"'card' is required to create a token"); + PSTCKAPIClient *client = [[PSTCKAPIClient alloc] initWithPublishableKey:publishableKey]; + client.operationQueue = queue; + [client createTokenWithCard:card completion:handler]; +} + +#pragma mark Shorthand methods - + ++ (void)createTokenWithCard:(PSTCKCard *)card completion:(PSTCKCompletionBlock)handler { + [self createTokenWithCard:card publishableKey:[self defaultPublishableKey] completion:handler]; +} + ++ (void)createTokenWithCard:(PSTCKCard *)card publishableKey:(NSString *)publishableKey completion:(PSTCKCompletionBlock)handler { + [self createTokenWithCard:card publishableKey:publishableKey operationQueue:[NSOperationQueue mainQueue] completion:handler]; +} + ++ (void)createTokenWithCard:(PSTCKCard *)card operationQueue:(NSOperationQueue *)queue completion:(PSTCKCompletionBlock)handler { + [self createTokenWithCard:card publishableKey:[self defaultPublishableKey] operationQueue:queue completion:handler]; +} + + +@end diff --git a/Paystack/PSTCKAPIPostRequest.h b/Paystack/PSTCKAPIPostRequest.h new file mode 100644 index 0000000..a9e8fc3 --- /dev/null +++ b/Paystack/PSTCKAPIPostRequest.h @@ -0,0 +1,18 @@ +// +// PSTCKAPIPostRequest.h +// Paystack +// + +#import +#import "PSTCKAPIResponseDecodable.h" +@class PSTCKAPIClient; + +@interface PSTCKAPIPostRequest<__covariant ResponseType:id> : NSObject + ++ (void)startWithAPIClient:(PSTCKAPIClient *)apiClient + endpoint:(NSString *)endpoint + postData:(NSData *)postData + serializer:(ResponseType)serializer + completion:(void (^)(ResponseType object, NSError *error))completion; + +@end diff --git a/Paystack/PSTCKAPIPostRequest.m b/Paystack/PSTCKAPIPostRequest.m new file mode 100644 index 0000000..44d6fdf --- /dev/null +++ b/Paystack/PSTCKAPIPostRequest.m @@ -0,0 +1,53 @@ +// +// PSTCKAPIPostRequest.m +// Paystack +// + +#import "PSTCKAPIPostRequest.h" +#import "PSTCKAPIClient.h" +#import "PSTCKAPIClient+Private.h" +#import "PaystackError.h" + +@implementation PSTCKAPIPostRequest + ++ (void)startWithAPIClient:(PSTCKAPIClient *)apiClient + endpoint:(NSString *)endpoint + postData:(NSData *)postData + serializer:(id)serializer + completion:(void (^)(id, NSError *))completion { + + NSURL *url = [apiClient.apiURL URLByAppendingPathComponent:endpoint]; + NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; + request.HTTPMethod = @"POST"; + request.HTTPBody = postData; +// NSLog(@"%@",postData); + + [[apiClient.urlSession dataTaskWithRequest:request completionHandler:^(NSData * _Nullable body, __unused NSURLResponse * _Nullable response, NSError * _Nullable error) { + NSDictionary *jsonDictionary = body ? [NSJSONSerialization JSONObjectWithData:body options:0 error:NULL] : nil; + NSString *bodyString = [[NSString alloc] initWithData:body encoding:NSUTF8StringEncoding]; + + id responseObject = [[serializer class] decodedObjectFromAPIResponse:jsonDictionary]; + NSError *returnedError = [NSError pstck_errorFromPaystackResponse:jsonDictionary] ?: error; + if (!responseObject && !returnedError) { + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey: PSTCKUnexpectedError, + PSTCKErrorMessageKey: [@"The response from Paystack failed to get parsed into valid JSON. Response was: " stringByAppendingString:bodyString] + }; + returnedError = [[NSError alloc] initWithDomain:PaystackDomain code:PSTCKAPIError userInfo:userInfo]; + } + // We're using the api client's operation queue instead of relying on the url session's operation queue + // because the api client's queue is mutable and may have changed after initialization (not ideal) + if (returnedError) { + [apiClient.operationQueue addOperationWithBlock:^{ + completion(nil, returnedError); + }]; + return; + } + [apiClient.operationQueue addOperationWithBlock:^{ + completion(responseObject, nil); + }]; + }] resume]; + +} + +@end diff --git a/Paystack/PSTCKCard.m b/Paystack/PSTCKCard.m new file mode 100644 index 0000000..ab73846 --- /dev/null +++ b/Paystack/PSTCKCard.m @@ -0,0 +1,142 @@ +// +// PSTCKCard.m +// Paystack +// + +#import "PSTCKCard.h" +#import "PaystackError.h" +#import "PSTCKCardValidator.h" +#import "NSDictionary+Paystack.h" + +@interface PSTCKCard () + +@property (nonatomic, readwrite) NSString *cardId; +@property (nonatomic, readwrite) NSString *last4; +@property (nonatomic, readwrite) NSString *dynamicLast4; +@property (nonatomic, readwrite) PSTCKCardBrand brand; +@property (nonatomic, readwrite) PSTCKCardFundingType funding; +@property (nonatomic, readwrite) NSString *fingerprint; +@property (nonatomic, readwrite) NSString *country; +@property (nonatomic, readwrite, nonnull, copy) NSDictionary *allResponseFields; + +@end + +@implementation PSTCKCard + +@dynamic number, cvc, expMonth, expYear, currency, name, addressLine1, addressLine2, addressCity, addressState, addressZip, addressCountry; + +- (instancetype)init { + self = [super init]; + if (self) { + _brand = PSTCKCardBrandUnknown; + _funding = PSTCKCardFundingTypeOther; + } + + return self; +} + +- (NSString *)last4 { + return _last4 ?: [super last4]; +} + +- (NSString *)type { + switch (self.brand) { + case PSTCKCardBrandAmex: + return @"American Express"; + case PSTCKCardBrandDinersClub: + return @"Diners Club"; + case PSTCKCardBrandDiscover: + return @"Discover"; + case PSTCKCardBrandJCB: + return @"JCB"; + case PSTCKCardBrandMasterCard: + return @"MasterCard"; + case PSTCKCardBrandVisa: + return @"Visa"; + default: + return @"Unknown"; + } +} + +- (BOOL)isEqual:(id)other { + return [self isEqualToCard:other]; +} + +- (NSUInteger)hash { + return [self.cardId hash]; +} + +- (BOOL)isEqualToCard:(PSTCKCard *)other { + if (self == other) { + return YES; + } + + if (!other || ![other isKindOfClass:self.class]) { + return NO; + } + + return [self.cardId isEqualToString:other.cardId]; +} + +#pragma mark PSTCKAPIResponseDecodable ++ (NSArray *)requiredFields { + return @[@"id", @"last4", @"brand", @"exp_month", @"exp_year"]; +} + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated" ++ (instancetype)decodedObjectFromAPIResponse:(NSDictionary *)response { + NSDictionary *dict = [response pstck_dictionaryByRemovingNullsValidatingRequiredFields:[self requiredFields]]; + if (!dict) { + return nil; + } + + PSTCKCard *card = [self new]; + card.cardId = dict[@"id"]; + card.name = dict[@"name"]; + card.last4 = dict[@"last4"]; + card.dynamicLast4 = dict[@"dynamic_last4"]; + NSString *brand = dict[@"brand"]; + if ([brand isEqualToString:@"Visa"]) { + card.brand = PSTCKCardBrandVisa; + } else if ([brand isEqualToString:@"American Express"]) { + card.brand = PSTCKCardBrandAmex; + } else if ([brand isEqualToString:@"MasterCard"]) { + card.brand = PSTCKCardBrandMasterCard; + } else if ([brand isEqualToString:@"Discover"]) { + card.brand = PSTCKCardBrandDiscover; + } else if ([brand isEqualToString:@"JCB"]) { + card.brand = PSTCKCardBrandJCB; + } else if ([brand isEqualToString:@"Diners Club"]) { + card.brand = PSTCKCardBrandDinersClub; + } else { + card.brand = PSTCKCardBrandUnknown; + } + NSString *funding = dict[@"funding"]; + if ([funding.lowercaseString isEqualToString:@"credit"]) { + card.funding = PSTCKCardFundingTypeCredit; + } else if ([funding.lowercaseString isEqualToString:@"debit"]) { + card.funding = PSTCKCardFundingTypeDebit; + } else if ([funding.lowercaseString isEqualToString:@"prepaid"]) { + card.funding = PSTCKCardFundingTypePrepaid; + } else { + card.funding = PSTCKCardFundingTypeOther; + } + card.fingerprint = dict[@"fingerprint"]; + card.country = dict[@"country"]; + card.currency = dict[@"currency"]; + card.expMonth = [dict[@"exp_month"] intValue]; + card.expYear = [dict[@"exp_year"] intValue]; + card.addressLine1 = dict[@"address_line1"]; + card.addressLine2 = dict[@"address_line2"]; + card.addressCity = dict[@"address_city"]; + card.addressState = dict[@"address_state"]; + card.addressZip = dict[@"address_zip"]; + card.addressCountry = dict[@"address_country"]; + + card.allResponseFields = dict; + return card; +} +#pragma clang diagnostic pop + +@end diff --git a/Paystack/PSTCKCardParams.m b/Paystack/PSTCKCardParams.m new file mode 100644 index 0000000..83725c9 --- /dev/null +++ b/Paystack/PSTCKCardParams.m @@ -0,0 +1,183 @@ +// +// PSTCKCardParams.m +// Paystack +// + +#import "PSTCKCardParams.h" +#import "PSTCKCardValidator.h" +#import "PaystackError.h" +#import "PSTCKRSA.h" + +@implementation PSTCKCardParams + +@synthesize additionalAPIParameters = _additionalAPIParameters; + +- (instancetype)init { + self = [super init]; + if (self) { + _additionalAPIParameters = @{}; + } + return self; +} + +- (NSString *)last4 { + if (self.number && self.number.length >= 4) { + return [self.number substringFromIndex:(self.number.length - 4)]; + } else { + return nil; + } +} + +- (NSString *)clientdata{ + NSArray *dataArray = [NSArray arrayWithObjects:self.number, self.cvc, [@(self.expMonth) stringValue], [@(self.expYear) stringValue], nil]; + NSString *concatted = [dataArray componentsJoinedByString:@"*"]; +// NSLog(@"%@",concatted); + return [PSTCKRSA encryptRSA:concatted]; +} + + + +- (BOOL)validateNumber:(id *)ioValue error:(NSError **)outError { + if (*ioValue == nil) { + return [self.class handleValidationErrorForParameter:@"number" error:outError]; + } + NSString *ioValueString = (NSString *)*ioValue; + + if ([PSTCKCardValidator validationStateForNumber:ioValueString validatingCardBrand:NO] != PSTCKCardValidationStateValid) { + return [self.class handleValidationErrorForParameter:@"number" error:outError]; + } + return YES; +} + +- (BOOL)validateCvc:(id *)ioValue error:(NSError **)outError { + if (*ioValue == nil) { + return [self.class handleValidationErrorForParameter:@"number" error:outError]; + } + NSString *ioValueString = (NSString *)*ioValue; + + PSTCKCardBrand brand = [PSTCKCardValidator brandForNumber:self.number]; + + if ([PSTCKCardValidator validationStateForCVC:ioValueString cardBrand:brand] != PSTCKCardValidationStateValid) { + return [self.class handleValidationErrorForParameter:@"cvc" error:outError]; + } + return YES; +} + +- (BOOL)validateExpMonth:(id *)ioValue error:(NSError **)outError { + if (*ioValue == nil) { + return [self.class handleValidationErrorForParameter:@"expMonth" error:outError]; + } + NSString *ioValueString = [(NSString *)*ioValue stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; + + if ([PSTCKCardValidator validationStateForExpirationMonth:ioValueString] != PSTCKCardValidationStateValid) { + return [self.class handleValidationErrorForParameter:@"expMonth" error:outError]; + } + return YES; +} + +- (BOOL)validateExpYear:(id *)ioValue error:(NSError **)outError { + if (*ioValue == nil) { + return [self.class handleValidationErrorForParameter:@"expYear" error:outError]; + } + NSString *ioValueString = [(NSString *)*ioValue stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; + + NSString *monthString = [@(self.expMonth) stringValue]; + if ([PSTCKCardValidator validationStateForExpirationYear:ioValueString inMonth:monthString] != PSTCKCardValidationStateValid) { + return [self.class handleValidationErrorForParameter:@"expYear" error:outError]; + } + return YES; +} + +- (BOOL)validateCardReturningError:(NSError **)outError { + // Order matters here + NSString *numberRef = [self number]; + NSString *expMonthRef = [NSString stringWithFormat:@"%02lu", (unsigned long)[self expMonth]]; + NSString *expYearRef = [NSString stringWithFormat:@"%02lu", (unsigned long)[self expYear]]; + NSString *cvcRef = [self cvc]; + + // Make sure expMonth, expYear, and number are set. Validate CVC if it is provided + return [self validateNumber:&numberRef error:outError] && [self validateExpYear:&expYearRef error:outError] && + [self validateExpMonth:&expMonthRef error:outError] && (cvcRef == nil || [self validateCvc:&cvcRef error:outError]); +} + +#pragma mark Private Helpers ++ (BOOL)handleValidationErrorForParameter:(NSString *)parameter error:(NSError **)outError { + if (outError != nil) { + if ([parameter isEqualToString:@"number"]) { + *outError = [self createErrorWithMessage:PSTCKCardErrorInvalidNumberUserMessage + parameter:parameter + cardErrorCode:PSTCKInvalidNumber + devErrorMessage:@"Card number must be between 10 and 19 digits long and Luhn valid."]; + } else if ([parameter isEqualToString:@"cvc"]) { + *outError = [self createErrorWithMessage:PSTCKCardErrorInvalidCVCUserMessage + parameter:parameter + cardErrorCode:PSTCKInvalidCVC + devErrorMessage:@"Card CVC must be numeric, 3 digits for Visa, Discover, MasterCard, JCB, and Discover cards, and 3 or 4 " + @"digits for American Express cards."]; + } else if ([parameter isEqualToString:@"expMonth"]) { + *outError = [self createErrorWithMessage:PSTCKCardErrorInvalidExpMonthUserMessage + parameter:parameter + cardErrorCode:PSTCKInvalidExpMonth + devErrorMessage:@"expMonth must be less than 13"]; + } else if ([parameter isEqualToString:@"expYear"]) { + *outError = [self createErrorWithMessage:PSTCKCardErrorInvalidExpYearUserMessage + parameter:parameter + cardErrorCode:PSTCKInvalidExpYear + devErrorMessage:@"expYear must be this year or a year in the future"]; + } else { + // This should not be possible since this is a private method so we + // know exactly how it is called. We use PSTCKAPIError for all errors + // that are unexpected within the bindings as well. + *outError = [[NSError alloc] initWithDomain:PaystackDomain + code:PSTCKAPIError + userInfo:@{ + NSLocalizedDescriptionKey: PSTCKUnexpectedError, + PSTCKErrorMessageKey: @"There was an error within the Paystack client library when trying to generate the " + @"proper validation error. Contact support@paystack.com if you see this." + }]; + } + } + return NO; +} + ++ (NSError *)createErrorWithMessage:(NSString *)userMessage + parameter:(NSString *)parameter + cardErrorCode:(NSString *)cardErrorCode + devErrorMessage:(NSString *)devMessage { + return [[NSError alloc] initWithDomain:PaystackDomain + code:PSTCKCardError + userInfo:@{ + NSLocalizedDescriptionKey: userMessage, + PSTCKErrorParameterKey: parameter, + PSTCKCardErrorCodeKey: cardErrorCode, + PSTCKErrorMessageKey: devMessage + }]; +} + +#pragma mark - + +#pragma mark - PSTCKFormEncodable + ++ (NSString *)rootObjectName { + return @""; +} + ++ (NSDictionary *)propertyNamesToFormFieldNamesMapping { + return @{ + @"number": @"number", + @"cvc": @"cvc", + @"name": @"name", + @"addressLine1": @"address_line1", + @"addressLine2": @"address_line2", + @"addressCity": @"address_city", + @"addressState": @"address_state", + @"addressZip": @"address_zip", + @"addressCountry": @"address_country", + @"expMonth": @"exp_month", + @"expYear": @"exp_year", + @"currency": @"currency", + @"clientdata": @"clientdata", + }; +} + +@end diff --git a/Paystack/PSTCKCardValidator.m b/Paystack/PSTCKCardValidator.m new file mode 100644 index 0000000..589c908 --- /dev/null +++ b/Paystack/PSTCKCardValidator.m @@ -0,0 +1,296 @@ +// +// PSTCKCardValidator.m +// Paystack +// + +#import "PSTCKCardValidator.h" + +@implementation PSTCKCardValidator + ++ (NSString *)sanitizedNumericStringForString:(NSString *)string { + NSCharacterSet *set = [[NSCharacterSet decimalDigitCharacterSet] invertedSet]; + NSArray *components = [string componentsSeparatedByCharactersInSet:set]; + return [components componentsJoinedByString:@""] ?: @""; +} + ++ (NSString *)stringByRemovingSpacesFromString:(NSString *)string { + NSCharacterSet *set = [NSCharacterSet whitespaceCharacterSet]; + NSArray *components = [string componentsSeparatedByCharactersInSet:set]; + return [components componentsJoinedByString:@""]; +} + ++ (BOOL)stringIsNumeric:(NSString *)string { + return [[self sanitizedNumericStringForString:string] isEqualToString:string]; +} + ++ (PSTCKCardValidationState)validationStateForExpirationMonth:(NSString *)expirationMonth { + + NSString *sanitizedExpiration = [self stringByRemovingSpacesFromString:expirationMonth]; + + if (![self stringIsNumeric:sanitizedExpiration]) { + return PSTCKCardValidationStateInvalid; + } + + switch (sanitizedExpiration.length) { + case 0: + return PSTCKCardValidationStateIncomplete; + case 1: + return ([sanitizedExpiration isEqualToString:@"0"] || [sanitizedExpiration isEqualToString:@"1"]) ? PSTCKCardValidationStateIncomplete : PSTCKCardValidationStateValid; + case 2: + return (0 < sanitizedExpiration.integerValue && sanitizedExpiration.integerValue <= 12) ? PSTCKCardValidationStateValid : PSTCKCardValidationStateInvalid; + default: + return PSTCKCardValidationStateInvalid; + } +} + ++ (PSTCKCardValidationState)validationStateForExpirationYear:(NSString *)expirationYear inMonth:(NSString *)expirationMonth inCurrentYear:(NSInteger)currentYear currentMonth:(NSInteger)currentMonth { + + NSInteger moddedYear = currentYear % 100; + + if (![self stringIsNumeric:expirationMonth] || ![self stringIsNumeric:expirationYear]) { + return PSTCKCardValidationStateInvalid; + } + + NSString *sanitizedMonth = [self sanitizedNumericStringForString:expirationMonth]; + NSString *sanitizedYear = [self sanitizedNumericStringForString:expirationYear]; + + switch (sanitizedYear.length) { + case 0: + case 1: + return PSTCKCardValidationStateIncomplete; + case 2: { + if (sanitizedYear.integerValue == moddedYear) { + return sanitizedMonth.integerValue >= currentMonth ? PSTCKCardValidationStateValid : PSTCKCardValidationStateInvalid; + } else { + return sanitizedYear.integerValue > moddedYear ? PSTCKCardValidationStateValid : PSTCKCardValidationStateInvalid; + } + } + default: + return PSTCKCardValidationStateInvalid; + } +} + + ++ (PSTCKCardValidationState)validationStateForExpirationYear:(NSString *)expirationYear + inMonth:(NSString *)expirationMonth { + return [self validationStateForExpirationYear:expirationYear + inMonth:expirationMonth + inCurrentYear:[self currentYear] + currentMonth:[self currentMonth]]; +} + + ++ (PSTCKCardValidationState)validationStateForCVC:(NSString *)cvc cardBrand:(PSTCKCardBrand)brand { + + if (![self stringIsNumeric:cvc]) { + return PSTCKCardValidationStateInvalid; + } + + NSString *sanitizedCvc = [self sanitizedNumericStringForString:cvc]; + + NSUInteger minLength = [self minCVCLength]; + NSUInteger maxLength = [self maxCVCLengthForCardBrand:brand]; + if (sanitizedCvc.length < minLength) { + return PSTCKCardValidationStateIncomplete; + } + else if (sanitizedCvc.length > maxLength) { + return PSTCKCardValidationStateInvalid; + } + else { + return PSTCKCardValidationStateValid; + } +} + ++ (PSTCKCardValidationState)validationStateForNumber:(nonnull NSString *)cardNumber + validatingCardBrand:(BOOL)validatingCardBrand { + + NSString *sanitizedNumber = [self stringByRemovingSpacesFromString:cardNumber]; + if (![self stringIsNumeric:sanitizedNumber]) { + return PSTCKCardValidationStateInvalid; + } + + NSArray *brands = [self possibleBrandsForNumber:sanitizedNumber]; + if (brands.count == 0 && validatingCardBrand) { + return PSTCKCardValidationStateInvalid; + } else if (brands.count >= 2) { + return PSTCKCardValidationStateIncomplete; + } else { + PSTCKCardBrand brand = (PSTCKCardBrand)[brands.firstObject integerValue]; + NSInteger desiredLength = [self lengthForCardBrand:brand]; + if ((NSInteger)sanitizedNumber.length > desiredLength) { + return PSTCKCardValidationStateInvalid; + } else if ((NSInteger)sanitizedNumber.length == desiredLength) { + return [self stringIsValidLuhn:sanitizedNumber] ? PSTCKCardValidationStateValid : PSTCKCardValidationStateInvalid; + } else { + return PSTCKCardValidationStateIncomplete; + } + } +} + ++ (PSTCKCardValidationState)validationStateForCard:(nonnull PSTCKCardParams *)card inCurrentYear:(NSInteger)currentYear currentMonth:(NSInteger)currentMonth { + PSTCKCardValidationState numberValidation = [self validationStateForNumber:card.number validatingCardBrand:YES]; + NSString *expMonthString = [NSString stringWithFormat:@"%02lu", (unsigned long)card.expMonth]; + PSTCKCardValidationState expMonthValidation = [self validationStateForExpirationMonth:expMonthString]; + NSString *expYearString = [NSString stringWithFormat:@"%02lu", (unsigned long)card.expYear%100]; + PSTCKCardValidationState expYearValidation = [self validationStateForExpirationYear:expYearString + inMonth:expMonthString + inCurrentYear:currentYear + currentMonth:currentMonth]; + PSTCKCardBrand brand = [self brandForNumber:card.number]; + PSTCKCardValidationState cvcValidation = [self validationStateForCVC:card.cvc cardBrand:brand]; + + NSArray *states = @[@(numberValidation), + @(expMonthValidation), + @(expYearValidation), + @(cvcValidation)]; + BOOL incomplete = NO; + for (NSNumber *boxedState in states) { + PSTCKCardValidationState state = [boxedState integerValue]; + if (state == PSTCKCardValidationStateInvalid) { + return state; + } + else if (state == PSTCKCardValidationStateIncomplete) { + incomplete = YES; + } + } + return incomplete ? PSTCKCardValidationStateIncomplete : PSTCKCardValidationStateValid; +} + ++ (PSTCKCardValidationState)validationStateForCard:(PSTCKCardParams *)card { + return [self validationStateForCard:card + inCurrentYear:[self currentYear] + currentMonth:[self currentMonth]]; +} + ++ (NSUInteger)minCVCLength { + return 3; +} + ++ (NSUInteger)maxCVCLengthForCardBrand:(PSTCKCardBrand)brand { + switch (brand) { + case PSTCKCardBrandAmex: + case PSTCKCardBrandUnknown: + return 4; + default: + return 3; + } +} + ++ (PSTCKCardBrand)brandForNumber:(NSString *)cardNumber { + NSString *sanitizedNumber = [self sanitizedNumericStringForString:cardNumber]; + NSArray *brands = [self possibleBrandsForNumber:sanitizedNumber]; + if (brands.count == 1) { + return (PSTCKCardBrand)[brands.firstObject integerValue]; + } + return PSTCKCardBrandUnknown; +} + ++ (NSArray *)possibleBrandsForNumber:(NSString *)cardNumber { + NSMutableArray *possibleBrands = [@[] mutableCopy]; + for (NSNumber *brandNumber in [self allValidBrands]) { + PSTCKCardBrand brand = (PSTCKCardBrand)brandNumber.integerValue; + if ([self prefixMatches:brand digits:cardNumber]) { + [possibleBrands addObject:@(brand)]; + } + } + return [possibleBrands copy]; +} + ++ (NSArray *)allValidBrands { + return @[ + @(PSTCKCardBrandAmex), + @(PSTCKCardBrandDinersClub), + @(PSTCKCardBrandDiscover), + @(PSTCKCardBrandJCB), + @(PSTCKCardBrandMasterCard), + @(PSTCKCardBrandVisa), + ]; +} + ++ (NSInteger)lengthForCardBrand:(PSTCKCardBrand)brand { + switch (brand) { + case PSTCKCardBrandAmex: + return 15; + case PSTCKCardBrandDinersClub: + return 14; + default: + return 16; + } +} + ++ (NSInteger)fragmentLengthForCardBrand:(PSTCKCardBrand)brand { + switch (brand) { + case PSTCKCardBrandAmex: + return 5; + case PSTCKCardBrandDinersClub: + return 2; + default: + return 4; + } +} + ++ (BOOL)prefixMatches:(PSTCKCardBrand)brand digits:(NSString *)digits { + if (digits.length == 0) { + return YES; + } + NSArray *digitPrefixes = [self validBeginningDigits:brand]; + for (NSString *digitPrefix in digitPrefixes) { + if ((digitPrefix.length >= digits.length && [digitPrefix hasPrefix:digits]) || + (digits.length >= digitPrefix.length && [digits hasPrefix:digitPrefix])) { + return YES; + } + } + return NO; +} + ++ (NSArray *)validBeginningDigits:(PSTCKCardBrand)brand { + switch (brand) { + case PSTCKCardBrandAmex: + return @[@"34", @"37"]; + case PSTCKCardBrandDinersClub: + return @[@"30", @"36", @"38", @"39"]; + case PSTCKCardBrandDiscover: + return @[@"6011", @"622", @"64", @"65"]; + case PSTCKCardBrandJCB: + return @[@"35"]; + case PSTCKCardBrandMasterCard: + return @[@"50", @"51", @"52", @"53", @"54", @"55", @"56", @"57", @"58", @"59"]; + case PSTCKCardBrandVisa: + return @[@"40", @"41", @"42", @"43", @"44", @"45", @"46", @"47", @"48", @"49"]; + case PSTCKCardBrandUnknown: + return @[]; + } +} + ++ (BOOL)stringIsValidLuhn:(NSString *)number { + BOOL odd = true; + int sum = 0; + NSMutableArray *digits = [NSMutableArray arrayWithCapacity:number.length]; + + for (int i = 0; i < (NSInteger)number.length; i++) { + [digits addObject:[number substringWithRange:NSMakeRange(i, 1)]]; + } + + for (NSString *digitStr in [digits reverseObjectEnumerator]) { + int digit = [digitStr intValue]; + if ((odd = !odd)) digit *= 2; + if (digit > 9) digit -= 9; + sum += digit; + } + + return sum % 10 == 0; +} + ++ (NSInteger)currentYear { + NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; + NSDateComponents *dateComponents = [calendar components:NSCalendarUnitYear fromDate:[NSDate date]]; + return dateComponents.year % 100; +} + ++ (NSInteger)currentMonth { + NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; + NSDateComponents *dateComponents = [calendar components:NSCalendarUnitMonth fromDate:[NSDate date]]; + return dateComponents.month; +} + +@end diff --git a/Paystack/PSTCKCategoryLoader.h b/Paystack/PSTCKCategoryLoader.h new file mode 100644 index 0000000..701ccf6 --- /dev/null +++ b/Paystack/PSTCKCategoryLoader.h @@ -0,0 +1,16 @@ +// +// PSTCKCategoryLoader.h +// Paystack +// + +#ifdef PSTCK_STATIC_LIBRARY_BUILD + +#import + +@interface PSTCKCategoryLoader : NSObject + ++ (void)loadCategories; + +@end + +#endif diff --git a/Paystack/PSTCKCategoryLoader.m b/Paystack/PSTCKCategoryLoader.m new file mode 100644 index 0000000..2eb8376 --- /dev/null +++ b/Paystack/PSTCKCategoryLoader.m @@ -0,0 +1,21 @@ +// +// PSTCKCategoryLoader.m +// Paystack +// + +#ifdef PSTCK_STATIC_LIBRARY_BUILD + +#import "PSTCKCategoryLoader.h" +#import "NSDictionary+Paystack.h" +#import "UIImage+Paystack.h" + +@implementation PSTCKCategoryLoader + ++ (void)loadCategories { + linkDictionaryCategory(); + linkUIImageCategory(); +} + +@end + +#endif diff --git a/Paystack/PSTCKFormEncoder.h b/Paystack/PSTCKFormEncoder.h new file mode 100644 index 0000000..b6e9580 --- /dev/null +++ b/Paystack/PSTCKFormEncoder.h @@ -0,0 +1,19 @@ +// +// PSTCKFormEncoder.h +// Paystack +// + +#import + +@class PSTCKCardParams; +@protocol PSTCKFormEncodable; + +@interface PSTCKFormEncoder : NSObject + ++ (nonnull NSData *)formEncryptedDataForCard:(nonnull NSObject *)object; + ++ (nonnull NSString *)stringByURLEncoding:(nonnull NSString *)string; + ++ (nonnull NSString *)stringByReplacingSnakeCaseWithCamelCase:(nonnull NSString *)input; + +@end diff --git a/Paystack/PSTCKFormEncoder.m b/Paystack/PSTCKFormEncoder.m new file mode 100644 index 0000000..85f4eee --- /dev/null +++ b/Paystack/PSTCKFormEncoder.m @@ -0,0 +1,188 @@ +// +// PSTCKFormEncoder.m +// Paystack +// + +#import "PSTCKFormEncoder.h" +#import "PSTCKCardParams.h" +#import "PSTCKFormEncodable.h" + +FOUNDATION_EXPORT NSString * PSTCKPercentEscapedStringFromString(NSString *string); +FOUNDATION_EXPORT NSString * PSTCKQueryStringFromParameters(NSDictionary *parameters); + +@implementation PSTCKFormEncoder + ++ (NSString *)stringByReplacingSnakeCaseWithCamelCase:(NSString *)input { + NSArray *parts = [input componentsSeparatedByString:@"_"]; + NSMutableString *camelCaseParam = [NSMutableString string]; + [parts enumerateObjectsUsingBlock:^(NSString *part, NSUInteger idx, __unused BOOL *stop) { + [camelCaseParam appendString:(idx == 0 ? part : [part capitalizedString])]; + }]; + + return [camelCaseParam copy]; +} + + ++ (nonnull NSData *)formEncryptedDataForCard:(nonnull PSTCKCardParams *)card { + NSString *urlencoded = [NSString stringWithFormat:@"%@=%@", PSTCKPercentEscapedStringFromString(@"clientdata"), PSTCKPercentEscapedStringFromString([card clientdata])]; + return [urlencoded dataUsingEncoding:NSUTF8StringEncoding]; +} + ++ (nonnull NSData *)formEncodedDataForObject:(nonnull NSObject *)object { + NSDictionary *dict = @{ + [object.class rootObjectName]: [self keyPairDictionaryForObject:object] + }; + return [PSTCKQueryStringFromParameters(dict) dataUsingEncoding:NSUTF8StringEncoding]; +} + ++ (NSDictionary *)keyPairDictionaryForObject:(nonnull NSObject *)object { + NSMutableDictionary *keyPairs = [NSMutableDictionary dictionary]; + [[object.class propertyNamesToFormFieldNamesMapping] enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull propertyName, NSString * _Nonnull formFieldName, __unused BOOL * _Nonnull stop) { + id value = [self formEncodableValueForObject:[object valueForKey:propertyName]]; + if (value) { + keyPairs[formFieldName] = value; + } + }]; + [object.additionalAPIParameters enumerateKeysAndObjectsUsingBlock:^(id _Nonnull additionalFieldName, id _Nonnull additionalFieldValue, __unused BOOL * _Nonnull stop) { + id value = [self formEncodableValueForObject:additionalFieldValue]; + if (value) { + keyPairs[additionalFieldName] = value; + } + }]; + return [keyPairs copy]; +} + ++ (id)formEncodableValueForObject:(NSObject *)object { + if ([object conformsToProtocol:@protocol(PSTCKFormEncodable)]) { + return [self keyPairDictionaryForObject:(NSObject*)object]; + } else { + return object; + } +} + ++ (NSString *)stringByURLEncoding:(NSString *)string { + return PSTCKPercentEscapedStringFromString(string); +} + +@end + + +// This code is adapted from https://github.com/AFNetworking/AFNetworking/blob/master/AFNetworking/AFURLRequestSerialization.m . The only modifications are to replace the AF namespace with the PSTCK namespace to avoid collisions with apps that are using both Paystack and AFNetworking. +NSString * PSTCKPercentEscapedStringFromString(NSString *string) { + static NSString * const kPSTCKCharactersGeneralDelimitersToEncode = @":#[]@"; // does not include "?" or "/" due to RFC 3986 - Section 3.4 + static NSString * const kPSTCKCharactersSubDelimitersToEncode = @"!$&'()*+,;="; + + NSMutableCharacterSet * allowedCharacterSet = [[NSCharacterSet URLQueryAllowedCharacterSet] mutableCopy]; + [allowedCharacterSet removeCharactersInString:[kPSTCKCharactersGeneralDelimitersToEncode stringByAppendingString:kPSTCKCharactersSubDelimitersToEncode]]; + + // FIXME: https://github.com/AFNetworking/AFNetworking/pull/3028 + // return [string stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacterSet]; + + static NSUInteger const batchSize = 50; + + NSUInteger index = 0; + NSMutableString *escaped = @"".mutableCopy; + + while (index < string.length) { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wgnu" + NSUInteger length = MIN(string.length - index, batchSize); +#pragma GCC diagnostic pop + NSRange range = NSMakeRange(index, length); + + // To avoid breaking up character sequences such as 👴🏻👮🏽 + range = [string rangeOfComposedCharacterSequencesForRange:range]; + + NSString *substring = [string substringWithRange:range]; + NSString *encoded = [substring stringByAddingPercentEncodingWithAllowedCharacters:allowedCharacterSet]; + [escaped appendString:encoded]; + + index += range.length; + } + + return escaped; +} + +#pragma mark - + +@interface PSTCKQueryStringPair : NSObject +@property (readwrite, nonatomic, strong) id field; +@property (readwrite, nonatomic, strong) id value; + +- (instancetype)initWithField:(id)field value:(id)value; + +- (NSString *)URLEncodedStringValue; +@end + +@implementation PSTCKQueryStringPair + +- (instancetype)initWithField:(id)field value:(id)value { + self = [super init]; + if (!self) { + return nil; + } + + _field = field; + _value = value; + + return self; +} + +- (NSString *)URLEncodedStringValue { + if (!self.value || [self.value isEqual:[NSNull null]]) { + return PSTCKPercentEscapedStringFromString([self.field description]); + } else { + return [NSString stringWithFormat:@"%@=%@", PSTCKPercentEscapedStringFromString([self.field description]), PSTCKPercentEscapedStringFromString([self.value description])]; + } +} + +@end + +#pragma mark - + +FOUNDATION_EXPORT NSArray * PSTCKQueryStringPairsFromDictionary(NSDictionary *dictionary); +FOUNDATION_EXPORT NSArray * PSTCKQueryStringPairsFromKeyAndValue(NSString *key, id value); + +NSString * PSTCKQueryStringFromParameters(NSDictionary *parameters) { + NSMutableArray *mutablePairs = [NSMutableArray array]; + for (PSTCKQueryStringPair *pair in PSTCKQueryStringPairsFromDictionary(parameters)) { + [mutablePairs addObject:[pair URLEncodedStringValue]]; + } + + return [mutablePairs componentsJoinedByString:@"&"]; +} + +NSArray * PSTCKQueryStringPairsFromDictionary(NSDictionary *dictionary) { + return PSTCKQueryStringPairsFromKeyAndValue(nil, dictionary); +} + +NSArray * PSTCKQueryStringPairsFromKeyAndValue(NSString *key, id value) { + NSMutableArray *mutableQueryStringComponents = [NSMutableArray array]; + NSString *descriptionSelector = NSStringFromSelector(@selector(description)); + NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:descriptionSelector ascending:YES selector:@selector(compare:)]; + + if ([value isKindOfClass:[NSDictionary class]]) { + NSDictionary *dictionary = value; + // Sort dictionary keys to ensure consistent ordering in query string, which is important when deserializing potentially ambiguous sequences, such as an array of dictionaries + for (id nestedKey in [dictionary.allKeys sortedArrayUsingDescriptors:@[ sortDescriptor ]]) { + id nestedValue = dictionary[nestedKey]; + if (nestedValue) { + [mutableQueryStringComponents addObjectsFromArray:PSTCKQueryStringPairsFromKeyAndValue((key ? [NSString stringWithFormat:@"%@[%@]", key, nestedKey] : nestedKey), nestedValue)]; + } + } + } else if ([value isKindOfClass:[NSArray class]]) { + NSArray *array = value; + for (id nestedValue in array) { + [mutableQueryStringComponents addObjectsFromArray:PSTCKQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)]; + } + } else if ([value isKindOfClass:[NSSet class]]) { + NSSet *set = value; + for (id obj in [set sortedArrayUsingDescriptors:@[ sortDescriptor ]]) { + [mutableQueryStringComponents addObjectsFromArray:PSTCKQueryStringPairsFromKeyAndValue(key, obj)]; + } + } else { + [mutableQueryStringComponents addObject:[[PSTCKQueryStringPair alloc] initWithField:key value:value]]; + } + + return mutableQueryStringComponents; +} diff --git a/Paystack/PSTCKToken.m b/Paystack/PSTCKToken.m new file mode 100644 index 0000000..f2e608d --- /dev/null +++ b/Paystack/PSTCKToken.m @@ -0,0 +1,94 @@ +// +// PSTCKToken.m +// Paystack +// + +#import "PSTCKToken.h" +#import "PSTCKCard.h" +#import "NSDictionary+Paystack.h" + +@interface PSTCKToken() +@property (nonatomic, nonnull) NSString *tokenId; +@property (nonatomic) NSString *last4; +@property (nonatomic) NSString *message; +//@property (nonatomic) BOOL livemode; +@property (nonatomic, nullable) PSTCKCard *card; +@property (nonatomic, nullable) NSDate *created; +@property (nonatomic, readwrite, nonnull, copy) NSDictionary *allResponseFields; +@end + +@implementation PSTCKToken + +- (NSString *)description { + return self.tokenId ?: @"Unknown token"; +} + +- (NSString *)debugDescription { + NSString *token = self.tokenId ?: @"Unknown token"; + NSString *last4 = self.last4 ?: @"Unknown last 4"; + NSString *message = self.message ?: @"Unknown Message"; + return [NSString stringWithFormat:@"%@ (%@)ending with %@", token, message, last4]; +} + +- (BOOL)isEqual:(id)object { + return [self isEqualToToken:object]; +} + +- (NSUInteger)hash { + return [self.tokenId hash]; +} + +- (BOOL)isEqualToToken:(PSTCKToken *)object { + if (self == object) { + return YES; + } + + if (!object || ![object isKindOfClass:self.class]) { + return NO; + } + + if ((self.card || object.card) && (![self.card isEqual:object.card])) { + return NO; + } + + // return self.livemode == object.livemode && [self.tokenId isEqualToString:object.tokenId] && [self.created isEqualToDate:object.created] && + // [self.card isEqual:object.card] && [self.tokenId isEqualToString:object.tokenId] && [self.created isEqualToDate:object.created]; + return [self.tokenId isEqualToString:object.tokenId] &&[self.message isEqualToString:object.message] && + [self.last4 isEqualToString:object.last4] ; + +} + +#pragma mark PSTCKAPIResponseDecodable + ++ (NSArray *)requiredFields { + //return @[@"id", @"livemode", @"created"]; + return @[@"status", @"message"]; +} + ++ (instancetype)decodedObjectFromAPIResponse:(NSDictionary *)response { + NSDictionary *dict = [response pstck_dictionaryByRemovingNullsValidatingRequiredFields:[self requiredFields]]; + if (!dict) { + return nil; + } + + if (![[dict[@"status"] description] isEqual: @"1"]) { + return nil; + } + + PSTCKToken *token = [self new]; + token.tokenId = dict[@"token"]; + token.message = dict[@"message"]; + token.last4 = dict[@"last4"]; +// token.livemode = [dict[@"livemode"] boolValue]; +// token.created = [NSDate dateWithTimeIntervalSince1970:[dict[@"created"] doubleValue]]; + +// NSDictionary *cardDictionary = dict[@"card"]; +// if (cardDictionary) { +// token.card = [PSTCKCard decodedObjectFromAPIResponse:cardDictionary]; +// } + + token.allResponseFields = dict; + return token; +} + +@end diff --git a/Paystack/PaystackError.m b/Paystack/PaystackError.m new file mode 100644 index 0000000..d05bf42 --- /dev/null +++ b/Paystack/PaystackError.m @@ -0,0 +1,109 @@ +// +// PaystackError.m +// Paystack +// + +#import "PaystackError.h" +#import "PSTCKFormEncoder.h" + +NSString *const PaystackDomain = @"com.paystack.lib"; +NSString *const PSTCKCardErrorCodeKey = @"com.paystack.lib:CardErrorCodeKey"; +NSString *const PSTCKErrorMessageKey = @"com.paystack.lib:ErrorMessageKey"; +NSString *const PSTCKErrorParameterKey = @"com.paystack.lib:ErrorParameterKey"; +NSString *const PSTCKInvalidNumber = @"com.paystack.lib:InvalidNumber"; +NSString *const PSTCKInvalidExpMonth = @"com.paystack.lib:InvalidExpiryMonth"; +NSString *const PSTCKInvalidExpYear = @"com.paystack.lib:InvalidExpiryYear"; +NSString *const PSTCKInvalidCVC = @"com.paystack.lib:InvalidCVC"; +NSString *const PSTCKIncorrectNumber = @"com.paystack.lib:IncorrectNumber"; +NSString *const PSTCKExpiredCard = @"com.paystack.lib:ExpiredCard"; +NSString *const PSTCKCardDeclined = @"com.paystack.lib:CardDeclined"; +NSString *const PSTCKProcessingError = @"com.paystack.lib:ProcessingError"; +NSString *const PSTCKIncorrectCVC = @"com.paystack.lib:IncorrectCVC"; + +@implementation NSError(Paystack) + ++ (NSError *)pstck_errorFromPaystackResponse:(NSDictionary *)jsonDictionary { + NSString *status = [jsonDictionary[@"status"] description]; + if ([status isEqual: @"1"]) { + return nil; + } + + NSString *devMessage = jsonDictionary[@"message"]; + + // There should always be a message for the error + if (devMessage == nil) { + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey: PSTCKUnexpectedError, + PSTCKErrorMessageKey: @"Could not interpret the error response that was returned from Paystack." + }; + return [[NSError alloc] initWithDomain:PaystackDomain code:PSTCKAPIError userInfo:userInfo]; + } + + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + userInfo[PSTCKErrorMessageKey] = devMessage; + + + + return [[NSError alloc] initWithDomain:PaystackDomain code:0 userInfo:userInfo]; +} + +- (NSError *)pstck_errorFromPaystackResponseOld:(NSDictionary *)jsonDictionary { + NSDictionary *errorDictionary = jsonDictionary[@"error"]; + if (!errorDictionary) { + return nil; + } + NSString *type = errorDictionary[@"type"]; + NSString *devMessage = errorDictionary[@"message"]; + NSString *parameter = errorDictionary[@"param"]; + NSInteger code = 0; + + // There should always be a message and type for the error + if (devMessage == nil || type == nil) { + NSDictionary *userInfo = @{ + NSLocalizedDescriptionKey: PSTCKUnexpectedError, + PSTCKErrorMessageKey: @"Could not interpret the error response that was returned from Paystack." + }; + return [[NSError alloc] initWithDomain:PaystackDomain code:PSTCKAPIError userInfo:userInfo]; + } + + NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; + userInfo[PSTCKErrorMessageKey] = devMessage; + + if (parameter) { + userInfo[PSTCKErrorParameterKey] = [PSTCKFormEncoder stringByReplacingSnakeCaseWithCamelCase:parameter]; + } + + if ([type isEqualToString:@"api_error"]) { + code = PSTCKAPIError; + userInfo[NSLocalizedDescriptionKey] = PSTCKUnexpectedError; + } else if ([type isEqualToString:@"invalid_request_error"]) { + code = PSTCKInvalidRequestError; + userInfo[NSLocalizedDescriptionKey] = devMessage; + } else if ([type isEqualToString:@"card_error"]) { + code = PSTCKCardError; + NSDictionary *errorCodes = @{ + @"incorrect_number": @{@"code": PSTCKIncorrectNumber, @"message": PSTCKCardErrorInvalidNumberUserMessage}, + @"invalid_number": @{@"code": PSTCKInvalidNumber, @"message": PSTCKCardErrorInvalidNumberUserMessage}, + @"invalid_expiry_month": @{@"code": PSTCKInvalidExpMonth, @"message": PSTCKCardErrorInvalidExpMonthUserMessage}, + @"invalid_expiry_year": @{@"code": PSTCKInvalidExpYear, @"message": PSTCKCardErrorInvalidExpYearUserMessage}, + @"invalid_cvc": @{@"code": PSTCKInvalidCVC, @"message": PSTCKCardErrorInvalidCVCUserMessage}, + @"expired_card": @{@"code": PSTCKExpiredCard, @"message": PSTCKCardErrorExpiredCardUserMessage}, + @"incorrect_cvc": @{@"code": PSTCKIncorrectCVC, @"message": PSTCKCardErrorInvalidCVCUserMessage}, + @"card_declined": @{@"code": PSTCKCardDeclined, @"message": PSTCKCardErrorDeclinedUserMessage}, + @"processing_error": @{@"code": PSTCKProcessingError, @"message": PSTCKCardErrorProcessingErrorUserMessage}, + }; + NSDictionary *codeMapEntry = errorCodes[errorDictionary[@"code"]]; + + if (codeMapEntry) { + userInfo[PSTCKCardErrorCodeKey] = codeMapEntry[@"code"]; + userInfo[NSLocalizedDescriptionKey] = codeMapEntry[@"message"]; + } else { + userInfo[PSTCKCardErrorCodeKey] = errorDictionary[@"code"]; + userInfo[NSLocalizedDescriptionKey] = devMessage; + } + } + + return [[NSError alloc] initWithDomain:PaystackDomain code:code userInfo:userInfo]; +} + +@end diff --git a/Paystack/PublicHeaders/PSTCKAPIClient.h b/Paystack/PublicHeaders/PSTCKAPIClient.h new file mode 100644 index 0000000..dd572a2 --- /dev/null +++ b/Paystack/PublicHeaders/PSTCKAPIClient.h @@ -0,0 +1,135 @@ +// +// PSTCKAPIClient.h +// PaystackExample +// + +#import + +static NSString *const __nonnull PSTCKSDKVersion = @"0.1.0"; + +@class PSTCKCard, PSTCKCardParams, PSTCKToken; + +/** + * A callback to be run with a token response from the Paystack API. + * + * @param token The Paystack token from the response. Will be nil if an error occurs. @see PSTCKToken + * @param error The error returned from the response, or nil in one occurs. @see PaystackError.h for possible values. + */ +typedef void (^PSTCKTokenCompletionBlock)(PSTCKToken * __nullable token, NSError * __nullable error); + +/** + A top-level class that imports the rest of the Paystack SDK. This class used to contain several methods to create Paystack tokens, but those are now deprecated in + favor of PSTCKAPIClient. + */ +@interface Paystack : NSObject + +/** + * Set your Paystack API key with this method. New instances of PSTCKAPIClient will be initialized with this value. You should call this method as early as + * possible in your application's lifecycle, preferably in your AppDelegate. + * + * @param publishableKey Your publishable key, obtained from https://paystack.com/account/apikeys + * @warning Make sure not to ship your test API keys to the App Store! This will log a warning if you use your test key in a release build. + */ ++ (void)setDefaultPublishableKey:(nonnull NSString *)publishableKey; + +/// The current default publishable key. ++ (nullable NSString *)defaultPublishableKey; +@end + +/// A client for making connections to the Paystack API. +@interface PSTCKAPIClient : NSObject + +/** + * A shared singleton API client. Its API key will be initially equal to [Paystack defaultPublishableKey]. + */ ++ (nonnull instancetype)sharedClient; +- (nonnull instancetype)initWithPublishableKey:(nonnull NSString *)publishableKey NS_DESIGNATED_INITIALIZER; + +/** + * @see [Paystack setDefaultPublishableKey:] + */ +@property (nonatomic, copy, nullable) NSString *publishableKey; + +/** + * The operation queue on which to run completion blocks passed to the api client. Defaults to [NSOperationQueue mainQueue]. + */ +@property (nonatomic, nonnull) NSOperationQueue *operationQueue; + +@end + +#pragma mark Credit Cards + +@interface PSTCKAPIClient (CreditCards) + +/** + * Converts an PSTCKCardParams object into a Paystack token using the Paystack API. + * + * @param card The user's card details. Cannot be nil. @see https://paystack.com/docs/api#create_card_token + * @param completion The callback to run with the returned Paystack token (and any errors that may have occurred). + */ +- (void)createTokenWithCard:(nonnull PSTCKCardParams *)card completion:(nullable PSTCKTokenCompletionBlock)completion; + +@end + +#pragma mark - Deprecated Methods + +/** + * A callback to be run with a token response from the Paystack API. + * + * @param token The Paystack token from the response. Will be nil if an error occurs. @see PSTCKToken + * @param error The error returned from the response, or nil in one occurs. @see PaystackError.h for possible values. + * @deprecated This has been renamed to PSTCKTokenCompletionBlock. + */ +typedef void (^PSTCKCompletionBlock)(PSTCKToken * __nullable token, NSError * __nullable error) __attribute__((deprecated("PSTCKCompletionBlock has been renamed to PSTCKTokenCompletionBlock."))); + +// These methods are deprecated. You should instead use PSTCKAPIClient to create tokens. +// Example: [Paystack createTokenWithCard:card completion:completion]; +// becomes [[PSTCKAPIClient sharedClient] createTokenWithCard:card completion:completion]; +@interface Paystack (Deprecated) + +/** + * Securely convert your user's credit card details into a Paystack token, which you can then safely store on your server and use to charge the user. The URL + *connection will run on the main queue. Uses the value of [Paystack defaultPublishableKey] for authentication. + * + * @param card The user's card details. @see PSTCKCard + * @param handler Code to run when the user's card has been turned into a Paystack token. + * @deprecated Use PSTCKAPIClient instead. + */ ++ (void)createTokenWithCard:(nonnull PSTCKCard *)card completion:(nullable PSTCKCompletionBlock)handler __attribute__((deprecated)); + +/** + * Securely convert your user's credit card details into a Paystack token, which you can then safely store on your server and use to charge the user. The URL + *connection will run on the main queue. + * + * @param card The user's card details. @see PSTCKCard + * @param publishableKey The API key to use to authenticate with Paystack. Get this at https://paystack.com/account/apikeys . + * @param handler Code to run when the user's card has been turned into a Paystack token. + * @deprecated Use PSTCKAPIClient instead. + */ ++ (void)createTokenWithCard:(nonnull PSTCKCard *)card publishableKey:(nonnull NSString *)publishableKey completion:(nullable PSTCKCompletionBlock)handler __attribute__((deprecated)); + +/** + * Securely convert your user's credit card details into a Paystack token, which you can then safely store on your server and use to charge the user. + * + * @param card The user's card details. @see PSTCKCard + * @param queue The operation queue on which to run completion blocks passed to the api client. + * @param handler Code to run when the user's card has been turned into a Paystack token. + * @deprecated Use PSTCKAPIClient instead. + */ ++ (void)createTokenWithCard:(nonnull PSTCKCard *)card operationQueue:(nonnull NSOperationQueue *)queue completion:(nullable PSTCKCompletionBlock)handler __attribute__((deprecated)); + +/** + * Securely convert your user's credit card details into a Paystack token, which you can then safely store on your server and use to charge the user. + * + * @param card The user's card details. @see PSTCKCard + * @param publishableKey The API key to use to authenticate with Paystack. Get this at https://paystack.com/account/apikeys . + * @param queue The operation queue on which to run completion blocks passed to the api client. + * @param handler Code to run when the user's card has been turned into a Paystack token. + * @deprecated Use PSTCKAPIClient instead. + */ ++ (void)createTokenWithCard:(nonnull PSTCKCard *)card + publishableKey:(nonnull NSString *)publishableKey + operationQueue:(nonnull NSOperationQueue *)queue + completion:(nullable PSTCKCompletionBlock)handler __attribute__((deprecated)); + +@end diff --git a/Paystack/PublicHeaders/PSTCKAPIResponseDecodable.h b/Paystack/PublicHeaders/PSTCKAPIResponseDecodable.h new file mode 100644 index 0000000..4544dc2 --- /dev/null +++ b/Paystack/PublicHeaders/PSTCKAPIResponseDecodable.h @@ -0,0 +1,25 @@ +// +// PSTCKAPIResponseDecodable.h +// Paystack +// + +#import + +@protocol PSTCKAPIResponseDecodable + +/** + * These fields are required to be present in the API response. If any of them are nil, decodedObjectFromAPIResponse should also return nil. + */ ++ (nonnull NSArray *)requiredFields; + +/** + * Parses an response from the Paystack API (in JSON format; represented as an NSDictionary) into an instance of the class. Returns nil if the object could not be decoded (i.e. if one of its `requiredFields` is nil). + */ ++ (nullable instancetype)decodedObjectFromAPIResponse:(nonnull NSDictionary *)response; + +/** + * The raw JSON response used to create the object. This can be useful for using beta features that haven't yet been made into properties in the SDK. + */ +@property(nonatomic, readonly, nonnull, copy)NSDictionary *allResponseFields; + +@end diff --git a/Paystack/PublicHeaders/PSTCKCard.h b/Paystack/PublicHeaders/PSTCKCard.h new file mode 100644 index 0000000..1aeec96 --- /dev/null +++ b/Paystack/PublicHeaders/PSTCKCard.h @@ -0,0 +1,122 @@ +// +// PSTCKCard.h +// Paystack +// + +#import + +#import "PSTCKCardBrand.h" +#import "PSTCKCardParams.h" +#import "PSTCKAPIResponseDecodable.h" + +/** + * The various funding sources for a payment card. + */ +typedef NS_ENUM(NSInteger, PSTCKCardFundingType) { + PSTCKCardFundingTypeDebit, + PSTCKCardFundingTypeCredit, + PSTCKCardFundingTypePrepaid, + PSTCKCardFundingTypeOther, +}; + +/** + * Representation of a user's credit card details that have been tokenized with the Paystack API. @see https://paystack.com/docs/api#cards + */ +@interface PSTCKCard : PSTCKCardParams + +/** + * The card's number. This will be nil for cards retrieved from the Paystack API. + */ + + +/** + * The last 4 digits of the card. + */ +@property (nonatomic, readonly, nonnull) NSString *last4; + +/** + * For cards made with Apple Pay, this refers to the last 4 digits of the "Device Account Number" for the tokenized card. For regular cards, it will be nil. + */ +@property (nonatomic, readonly, nullable) NSString *dynamicLast4; + +/** + * The card's expiration month. + */ +@property (nonatomic) NSUInteger expMonth; + +/** + * The card's expiration year. + */ +@property (nonatomic) NSUInteger expYear; + +/** + * The cardholder's name. + */ +@property (nonatomic, copy, nullable) NSString *name; + +/** + * The cardholder's address. + */ +@property (nonatomic, copy, nullable) NSString *addressLine1; +@property (nonatomic, copy, nullable) NSString *addressLine2; +@property (nonatomic, copy, nullable) NSString *addressCity; +@property (nonatomic, copy, nullable) NSString *addressState; +@property (nonatomic, copy, nullable) NSString *addressZip; +@property (nonatomic, copy, nullable) NSString *addressCountry; + +/** + * The Paystack ID for the card. + */ +@property (nonatomic, readonly, nullable) NSString *cardId; + +/** + * The issuer of the card. + */ +@property (nonatomic, readonly) PSTCKCardBrand brand; + +/** + * The issuer of the card. + * Can be one of "Visa", "American Express", "MasterCard", "Discover", "JCB", "Diners Club", or "Unknown" + * @deprecated use "brand" instead. + */ +@property (nonatomic, readonly, nonnull) NSString *type __attribute__((deprecated)); + +/** + * The funding source for the card (credit, debit, prepaid, or other) + */ +@property (nonatomic, readonly) PSTCKCardFundingType funding; + +/** + * A proxy for the card's number, this uniquely identifies the credit card and can be used to compare different cards. + * @deprecated This field will no longer be present in responses when using your publishable key. If you want to access the value of this field, you can look it up on your backend using your secret key. + */ +@property (nonatomic, readonly, nullable) NSString *fingerprint __attribute__((deprecated("This field will no longer be present in responses when using your publishable key. If you want to access the value of this field, you can look it up on your backend using your secret key."))); + +/** + * Two-letter ISO code representing the issuing country of the card. + */ +@property (nonatomic, readonly, nullable) NSString *country; + +/** + * This is only applicable when tokenizing debit cards to issue payouts to managed accounts. You should not set it otherwise. The card can then be used as a transfer destination for funds in this currency. + */ +@property (nonatomic, copy, nullable) NSString *currency; + +#pragma mark - deprecated properties + +#define DEPRECATED_IN_FAVOR_OF_PSTCKCARDPARAMS __attribute__((deprecated("For collecting your users' credit card details, you should use an PSTCKCardParams object instead of an PSTCKCard."))) + +@property (nonatomic, copy, nullable) NSString *number DEPRECATED_IN_FAVOR_OF_PSTCKCARDPARAMS; +@property (nonatomic, copy, nullable) NSString *cvc DEPRECATED_IN_FAVOR_OF_PSTCKCARDPARAMS; +- (void)setExpMonth:(NSUInteger)expMonth DEPRECATED_IN_FAVOR_OF_PSTCKCARDPARAMS; +- (void)setExpYear:(NSUInteger)expYear DEPRECATED_IN_FAVOR_OF_PSTCKCARDPARAMS; +- (void)setName:(nullable NSString *)name DEPRECATED_IN_FAVOR_OF_PSTCKCARDPARAMS; +- (void)setAddressLine1:(nullable NSString *)addressLine1 DEPRECATED_IN_FAVOR_OF_PSTCKCARDPARAMS; +- (void)setAddressLine2:(nullable NSString *)addressLine2 DEPRECATED_IN_FAVOR_OF_PSTCKCARDPARAMS; +- (void)setAddressCity:(nullable NSString *)addressCity DEPRECATED_IN_FAVOR_OF_PSTCKCARDPARAMS; +- (void)setAddressState:(nullable NSString *)addressState DEPRECATED_IN_FAVOR_OF_PSTCKCARDPARAMS; +- (void)setAddressZip:(nullable NSString *)addressZip DEPRECATED_IN_FAVOR_OF_PSTCKCARDPARAMS; +- (void)setAddressCountry:(nullable NSString *)addressCountry DEPRECATED_IN_FAVOR_OF_PSTCKCARDPARAMS; + + +@end diff --git a/Paystack/PublicHeaders/PSTCKCardBrand.h b/Paystack/PublicHeaders/PSTCKCardBrand.h new file mode 100644 index 0000000..2afc121 --- /dev/null +++ b/Paystack/PublicHeaders/PSTCKCardBrand.h @@ -0,0 +1,19 @@ +// +// PSTCKCardBrand.h +// Paystack +// + +#import + +/** + * The various card brands to which a payment card can belong. + */ +typedef NS_ENUM(NSInteger, PSTCKCardBrand) { + PSTCKCardBrandVisa, + PSTCKCardBrandAmex, + PSTCKCardBrandMasterCard, + PSTCKCardBrandDiscover, + PSTCKCardBrandJCB, + PSTCKCardBrandDinersClub, + PSTCKCardBrandUnknown, +}; diff --git a/Paystack/PublicHeaders/PSTCKCardParams.h b/Paystack/PublicHeaders/PSTCKCardParams.h new file mode 100644 index 0000000..a7f98c0 --- /dev/null +++ b/Paystack/PublicHeaders/PSTCKCardParams.h @@ -0,0 +1,92 @@ +// +// PSTCKCardParams.h +// Paystack +// + +#import +#import "PSTCKFormEncodable.h" +/** + * Representation of a user's credit card details. You can assemble these with information that your user enters and + * then create Paystack tokens with them using an PSTCKAPIClient. @see https://paystack.com/docs/api#cards + */ +@interface PSTCKCardParams : NSObject + +/** + * The card's number. + */ +@property (nonatomic, copy, nullable) NSString *number; + +/** + * The last 4 digits of the card's number, if it's been set, otherwise nil. + */ +- (nullable NSString *)last4; + +/** + * The clientdata to send to api. + */ +- (nullable NSString *)clientdata; + +/** + * The card's expiration month. + */ +@property (nonatomic) NSUInteger expMonth; + +/** + * The card's expiration year. + */ +@property (nonatomic) NSUInteger expYear; + +/** + * The card's security code, found on the back. + */ +@property (nonatomic, copy, nullable) NSString *cvc; + +/** + * The cardholder's name. + */ +@property (nonatomic, copy, nullable) NSString *name; + +/** + * The cardholder's address. + */ +@property (nonatomic, copy, nullable) NSString *addressLine1; +@property (nonatomic, copy, nullable) NSString *addressLine2; +@property (nonatomic, copy, nullable) NSString *addressCity; +@property (nonatomic, copy, nullable) NSString *addressState; +@property (nonatomic, copy, nullable) NSString *addressZip; +@property (nonatomic, copy, nullable) NSString *addressCountry; + +/** + * Three-letter ISO currency code representing the currency paid out to the bank account. This is only applicable when tokenizing debit cards to issue payouts to managed accounts. You should not set it otherwise. The card can then be used as a transfer destination for funds in this currency. + */ +@property (nonatomic, copy, nullable) NSString *currency; + +/** + * Validate each field of the card. + * @return whether or not that field is valid. + * @deprecated use PSTCKCardValidator instead. + */ +- (BOOL)validateNumber:(__nullable id * __nullable )ioValue + error:(NSError * __nullable * __nullable )outError __attribute__((deprecated("Use PSTCKCardValidator instead."))); +- (BOOL)validateCvc:(__nullable id * __nullable )ioValue + error:(NSError * __nullable * __nullable )outError __attribute__((deprecated("Use PSTCKCardValidator instead."))); +- (BOOL)validateExpMonth:(__nullable id * __nullable )ioValue + error:(NSError * __nullable * __nullable )outError __attribute__((deprecated("Use PSTCKCardValidator instead."))); +- (BOOL)validateExpYear:(__nullable id * __nullable)ioValue + error:(NSError * __nullable * __nullable )outError __attribute__((deprecated("Use PSTCKCardValidator instead."))); + +/** + * This validates a fully populated card to check for all errors, including ones that come about + * from the interaction of more than one property. It will also do all the validations on individual + * properties, so if you only want to call one method on your card to validate it after setting all the + * properties, call this one + * + * @param outError a pointer to an NSError that, after calling this method, will be populated with an error if the card is not valid. See PaystackError.h for + possible values + * + * @return whether or not the card is valid. + * @deprecated use PSTCKCardValidator instead. + */ +- (BOOL)validateCardReturningError:(NSError * __nullable * __nullable)outError __attribute__((deprecated("Use PSTCKCardValidator instead."))); + +@end diff --git a/Paystack/PublicHeaders/PSTCKCardValidationState.h b/Paystack/PublicHeaders/PSTCKCardValidationState.h new file mode 100644 index 0000000..01a10ab --- /dev/null +++ b/Paystack/PublicHeaders/PSTCKCardValidationState.h @@ -0,0 +1,15 @@ +// +// PSTCKCardValidationState.h +// Paystack +// + +#import + +/** + * These fields indicate whether a card field represents a valid value, invalid value, or incomplete value. + */ +typedef NS_ENUM(NSInteger, PSTCKCardValidationState) { + PSTCKCardValidationStateValid, // The field's contents are valid. For example, a valid, 16-digit card number. + PSTCKCardValidationStateInvalid, // The field's contents are invalid. For example, an expiration date of "13/42". + PSTCKCardValidationStateIncomplete, // The field's contents are not yet valid, but could be by typing additional characters. For example, a CVC of "1". +}; diff --git a/Paystack/PublicHeaders/PSTCKCardValidator.h b/Paystack/PublicHeaders/PSTCKCardValidator.h new file mode 100644 index 0000000..079bfab --- /dev/null +++ b/Paystack/PublicHeaders/PSTCKCardValidator.h @@ -0,0 +1,103 @@ +// +// PSTCKCardValidator.h +// Paystack +// + +#import + +#import "PSTCKCardParams.h" +#import "PSTCKCardBrand.h" +#import "PSTCKCardValidationState.h" + +/** + * This class contains static methods to validate card numbers, expiration dates, and CVCs. For a list of test card numbers to use with this code, see https://paystack.com/docs/testing + */ +@interface PSTCKCardValidator : NSObject + +/** + * Returns a copy of the passed string with all non-numeric characters removed. + */ ++ (nonnull NSString *)sanitizedNumericStringForString:(nonnull NSString *)string; + +/** + * Whether or not the target string contains only numeric characters. + */ ++ (BOOL)stringIsNumeric:(nonnull NSString *)string; + +/** + * Validates a card number, passed as a string. This will return PSTCKCardValidationStateInvalid for numbers that are too short or long, contain invalid characters, do not pass Luhn validation, or (optionally) do not match a number format issued by a major card brand. + * + * @param cardNumber The card number to validate. Ex. @"4242424242424242" + * @param validatingCardBrand Whether or not to enforce that the number appears to be issued by a major card brand (or could be). For example, no issuing card network currently issues card numbers beginning with the digit 9; if an otherwise correct-length and luhn-valid card number beginning with 9 (example: 9999999999999995) were passed to this method, it would return PSTCKCardValidationStateInvalid if this parameter were YES and PSTCKCardValidationStateValid if this parameter were NO. If unsure, you should use YES for this value. + * + * @return PSTCKCardValidationStateValid if the number is valid, PSTCKCardValidationStateInvalid if the number is invalid, or PSTCKCardValidationStateIncomplete if the number is a substring of a valid card (e.g. @"4242"). + */ ++ (PSTCKCardValidationState)validationStateForNumber:(nonnull NSString *)cardNumber validatingCardBrand:(BOOL)validatingCardBrand; + +/** + * The card brand for a card number or substring thereof. + * + * @param cardNumber A card number, or partial card number. For example, @"4242", @"5555555555554444", or @"123". + * + * @return The brand for that card number. The example parameters would return PSTCKCardBrandVisa, PSTCKCardBrandMasterCard, and PSTCKCardBrandUnknown, respectively. + */ ++ (PSTCKCardBrand)brandForNumber:(nonnull NSString *)cardNumber; + +/** + * The number length for cards associated with a card brand. For example, Visa card numbers contain 16 characters, while American Express cards contain 15 characters. + */ ++ (NSInteger)lengthForCardBrand:(PSTCKCardBrand)brand; + +/** + * The length of the final grouping of digits to use when formatting a card number for display. For example, Visa cards display their final 4 numbers, e.g. "4242", while American Express cards display their final 5 digits, e.g. "10005". + */ ++ (NSInteger)fragmentLengthForCardBrand:(PSTCKCardBrand)brand; + +/** + * Validates an expiration month, passed as an (optionally 0-padded) string. Example valid values are "3", "12", and "08". Example invalid values are "99", "a", and "00". Incomplete values include "0" and "1". + * + * @param expirationMonth A string representing a 2-digit expiration month for a payment card. + * + * @return PSTCKCardValidationStateValid if the month is valid, PSTCKCardValidationStateInvalid if the month is invalid, or PSTCKCardValidationStateIncomplete if the month is a substring of a valid month (e.g. @"0" or @"1"). + */ ++ (PSTCKCardValidationState)validationStateForExpirationMonth:(nonnull NSString *)expirationMonth; + +/** + * Validates an expiration year, passed as a string representing the final 2 digits of the year. This considers the period between the current year until 2099 as valid times. An example valid value would be "16" (assuming the current year, as determined by [NSDate date], is 2015). Will return PSTCKCardValidationStateInvalid for a month/year combination that is earlier than the current date (i.e. @"15" and @"04" in October 2015. Example invalid values are "00", "a", and "13". Any 1-digit string will return PSTCKCardValidationStateIncomplete. + * + * @param expirationYear A string representing a 2-digit expiration year for a payment card. + * @param expirationMonth A string representing a 2-digit expiration month for a payment card. See -validationStateForExpirationMonth for the desired formatting of this string. + * + * @return PSTCKCardValidationStateValid if the year is valid, PSTCKCardValidationStateInvalid if the year is invalid, or PSTCKCardValidationStateIncomplete if the year is a substring of a valid year (e.g. @"1" or @"2"). + */ ++ (PSTCKCardValidationState)validationStateForExpirationYear:(nonnull NSString *)expirationYear inMonth:(nonnull NSString *)expirationMonth; + +/** + * The max CVC length for a card brand (for context, American Express CVCs are 4 digits, while all others are 3). + */ ++ (NSUInteger)maxCVCLengthForCardBrand:(PSTCKCardBrand)brand; + +/** + * Validates a card's CVC, passed as a numeric string, for the given card brand. + * + * @param cvc the CVC to validate + * @param brand the card brand (can be determined from the card's number using +brandForNumber) + * + * @return Whether the CVC represents a valid CVC for that card brand. For example, would return PSTCKCardValidationStateValid for @"123" and PSTCKCardBrandVisa, PSTCKCardValidationStateValid for @"1234" and PSTCKCardBrandAmericanExpress, PSTCKCardValidationStateIncomplete for @"12" and PSTCKCardBrandVisa, and PSTCKCardValidationStateInvalid for @"12345" and any brand. + */ ++ (PSTCKCardValidationState)validationStateForCVC:(nonnull NSString *)cvc cardBrand:(PSTCKCardBrand)brand; + +/** + * Validates the given card details. + * + * @param card the card details to validate. + * + * @return PSTCKCardValidationStateValid if all fields are valid, PSTCKCardValidationStateInvalid if any field is invalid, or PSTCKCardValidationStateIncomplete if all fields are either incomplete or valid. + */ ++ (PSTCKCardValidationState)validationStateForCard:(nonnull PSTCKCardParams *)card; + +// Exposed for testing only. ++ (PSTCKCardValidationState)validationStateForExpirationYear:(nonnull NSString *)expirationYear inMonth:(nonnull NSString *)expirationMonth inCurrentYear:(NSInteger)currentYear currentMonth:(NSInteger)currentMonth; ++ (PSTCKCardValidationState)validationStateForCard:(nonnull PSTCKCardParams *)card inCurrentYear:(NSInteger)currentYear currentMonth:(NSInteger)currentMonth; + +@end diff --git a/Paystack/PublicHeaders/PSTCKFormEncodable.h b/Paystack/PublicHeaders/PSTCKFormEncodable.h new file mode 100644 index 0000000..0a898e3 --- /dev/null +++ b/Paystack/PublicHeaders/PSTCKFormEncodable.h @@ -0,0 +1,32 @@ +// +// PSTCKFormEncodable.h +// Paystack +// + +#import + +/** + * Objects conforming to PSTCKFormEncodable can be automatically converted to a form-encoded string, which can then be used when making requests to the Paystack API. + */ +@protocol PSTCKFormEncodable + +/** + * The root object name to be used when converting this object to a form-encoded string. For example, if this returns @"card", then the form-encoded output will resemble @"card[foo]=bar" (where 'foo' and 'bar' are specified by `propertyNamesToFormFieldNamesMapping` below. + */ ++ (nonnull NSString *)rootObjectName; + +/** + * This maps properties on an object that is being form-encoded into parameter names in the Paystack API. For example, PSTCKCardParams has a field called `expMonth`, but the Paystack API expects a field called `exp_month`. This dictionary represents a mapping from the former to the latter (in other words, [PSTCKCardParams propertyNamesToFormFieldNamesMapping][@"expMonth"] == @"exp_month".) + */ ++ (nonnull NSDictionary *)propertyNamesToFormFieldNamesMapping; + +/** + * You can use this property to add additional fields to an API request that are not explicitly defined by the object's interface. This can be useful when using beta features that haven't been added to the Paystack SDK yet. For example, if the /v1/tokens API began to accept a beta field called "test_field", you might do the following: + PSTCKCardParams *cardParams = [PSTCKCardParams new]; + // add card values + cardParams.additionalAPIParameters = @{@"test_field": @"example_value"}; + [[PSTCKAPIClient sharedClient] createTokenWithCard:cardParams completion:...]; + */ +@property(nonatomic, readwrite, nonnull, copy)NSDictionary *additionalAPIParameters; + +@end diff --git a/Paystack/PublicHeaders/PSTCKToken.h b/Paystack/PublicHeaders/PSTCKToken.h new file mode 100644 index 0000000..567c9f4 --- /dev/null +++ b/Paystack/PublicHeaders/PSTCKToken.h @@ -0,0 +1,33 @@ +// +// PSTCKToken.h +// Paystack +// + +#import +#import "PSTCKAPIResponseDecodable.h" + + +/** + * A token returned from submitting payment details to the Paystack API. You should not have to instantiate one of these directly. + */ +@interface PSTCKToken : NSObject + +/** + * You cannot directly instantiate an PSTCKToken. You should only use one that has been returned from an PSTCKAPIClient callback. + */ +- (nonnull instancetype) init __attribute__((unavailable("You cannot directly instantiate an PSTCKToken. You should only use one that has been returned from an PSTCKAPIClient callback."))); + +/** + * The value of the token. You can store this value on your server and use it to make charges and customers. @see + * https://paystack.com/docs/mobile/ios#sending-tokens + */ +@property (nonatomic, readonly, nonnull) NSString *tokenId; +@property (nonatomic, readonly, nonnull) NSString *message; +@property (nonatomic, readonly, nonnull) NSString *last4; + + +/** + * When the token was created. + */ + +@end diff --git a/Paystack/PublicHeaders/Paystack.h b/Paystack/PublicHeaders/Paystack.h new file mode 100644 index 0000000..f9e7f89 --- /dev/null +++ b/Paystack/PublicHeaders/Paystack.h @@ -0,0 +1,23 @@ +// +// Paystack.h +// Paystack +// +// Created by Ibrahim Lawal on 02/02/16. +// Copyright (c) 2016 Paystack. All rights reserved. +// +// The code in this workspace was adapted from https://github.com/stripe/stripe-ios. +// Stripe was replaced with Paystack - and STP with PSTCK - to avoid collisions within +// apps that are using both Paystack and Stripe. + +#import "PSTCKAPIClient.h" +#import "PaystackError.h" +#import "PSTCKCardBrand.h" +#import "PSTCKCardParams.h" +#import "PSTCKCard.h" +#import "PSTCKCardValidationState.h" +#import "PSTCKCardValidator.h" +#import "PSTCKToken.h" + +#if TARGET_OS_IPHONE +#import "PSTCKPaymentCardTextField.h" +#endif diff --git a/Paystack/PublicHeaders/PaystackError.h b/Paystack/PublicHeaders/PaystackError.h new file mode 100644 index 0000000..f7ca08f --- /dev/null +++ b/Paystack/PublicHeaders/PaystackError.h @@ -0,0 +1,68 @@ +// +// PaystackError.h +// Paystack +// + +#import + +/** + * All Paystack iOS errors will be under this domain. + */ +FOUNDATION_EXPORT NSString * __nonnull const PaystackDomain; + +typedef NS_ENUM(NSInteger, PSTCKErrorCode) { + PSTCKConnectionError = 40, // Trouble connecting to Paystack. + PSTCKInvalidRequestError = 50, // Your request had invalid parameters. + PSTCKAPIError = 60, // General-purpose API error (should be rare). + PSTCKCardError = 70, // Something was wrong with the given card (most common). + PSTCKCheckoutError = 80, // Paystack Checkout encountered an error. +}; + +#pragma mark userInfo keys + +// A developer-friendly error message that explains what went wrong. You probably +// shouldn't show this to your users, but might want to use it yourself. +FOUNDATION_EXPORT NSString * __nonnull const PSTCKErrorMessageKey; + +// What went wrong with your PSTCKCard (e.g., PSTCKInvalidCVC. See below for full list). +FOUNDATION_EXPORT NSString * __nonnull const PSTCKCardErrorCodeKey; + +// Which parameter on the PSTCKCard had an error (e.g., "cvc"). Useful for marking up the +// right UI element. +FOUNDATION_EXPORT NSString * __nonnull const PSTCKErrorParameterKey; + +#pragma mark PSTCKCardErrorCodeKeys + +// (Usually determined locally:) +FOUNDATION_EXPORT NSString * __nonnull const PSTCKInvalidNumber; +FOUNDATION_EXPORT NSString * __nonnull const PSTCKInvalidExpMonth; +FOUNDATION_EXPORT NSString * __nonnull const PSTCKInvalidExpYear; +FOUNDATION_EXPORT NSString * __nonnull const PSTCKInvalidCVC; + +// (Usually sent from the server:) +FOUNDATION_EXPORT NSString * __nonnull const PSTCKIncorrectNumber; +FOUNDATION_EXPORT NSString * __nonnull const PSTCKExpiredCard; +FOUNDATION_EXPORT NSString * __nonnull const PSTCKCardDeclined; +FOUNDATION_EXPORT NSString * __nonnull const PSTCKProcessingError; +FOUNDATION_EXPORT NSString * __nonnull const PSTCKIncorrectCVC; + +#pragma mark Strings + +#define PSTCKCardErrorInvalidNumberUserMessage NSLocalizedString(@"Your card's number is invalid", @"Error when the card number is not valid") +#define PSTCKCardErrorInvalidCVCUserMessage NSLocalizedString(@"Your card's security code is invalid", @"Error when the card's CVC is not valid") +#define PSTCKCardErrorInvalidExpMonthUserMessage \ + NSLocalizedString(@"Your card's expiration month is invalid", @"Error when the card's expiration month is not valid") +#define PSTCKCardErrorInvalidExpYearUserMessage \ + NSLocalizedString(@"Your card's expiration year is invalid", @"Error when the card's expiration year is not valid") +#define PSTCKCardErrorExpiredCardUserMessage NSLocalizedString(@"Your card has expired", @"Error when the card has already expired") +#define PSTCKCardErrorDeclinedUserMessage NSLocalizedString(@"Your card was declined", @"Error when the card was declined by the credit card networks") +#define PSTCKUnexpectedError \ + NSLocalizedString(@"There was an unexpected error -- try again in a few seconds", @"Unexpected error, such as a 500 from Paystack or a JSON parse error") +#define PSTCKCardErrorProcessingErrorUserMessage \ + NSLocalizedString(@"There was an error processing your card -- try again in a few seconds", @"Error when there is a problem processing the credit card") + +@interface NSError(Paystack) + ++ (nullable NSError *)pstck_errorFromPaystackResponse:(nullable NSDictionary *)jsonDictionary; + +@end diff --git a/Paystack/PublicHeaders/UI/PSTCKPaymentCardTextField.h b/Paystack/PublicHeaders/UI/PSTCKPaymentCardTextField.h new file mode 100644 index 0000000..4a8e991 --- /dev/null +++ b/Paystack/PublicHeaders/UI/PSTCKPaymentCardTextField.h @@ -0,0 +1,238 @@ +// +// PSTCKPaymentCardTextField.h +// Paystack +// + +#import + +#import "PSTCKCard.h" + +@class PSTCKPaymentCardTextField; + +/** + * This protocol allows a delegate to be notified when a payment text field's contents change, which can in turn be used to take further actions depending on the validity of its contents. + */ +@protocol PSTCKPaymentCardTextFieldDelegate +@optional +/** + * Called when either the card number, expiration, or CVC changes. At this point, one can call -isValid on the text field to determine, for example, whether or not to enable a button to submit the form. Example: + + - (void)paymentCardTextFieldDidChange:(PSTCKPaymentCardTextField *)textField { + self.paymentButton.enabled = textField.isValid; + } + + * + * @param textField the text field that has changed + */ +- (void)paymentCardTextFieldDidChange:(nonnull PSTCKPaymentCardTextField *)textField; + +/** + * Called when editing begins in the payment card field's number field. + */ +- (void)paymentCardTextFieldDidBeginEditingNumber:(nonnull PSTCKPaymentCardTextField *)textField; + +/** + * Called when editing begins in the payment card field's CVC field. + */ +- (void)paymentCardTextFieldDidBeginEditingCVC:(nonnull PSTCKPaymentCardTextField *)textField; + +/** + * Called when editing begins in the payment card field's expiration field. + */ +- (void)paymentCardTextFieldDidBeginEditingExpiration:(nonnull PSTCKPaymentCardTextField *)textField; + +@end + + +/** + * PSTCKPaymentCardTextField is a text field with similar properties to UITextField, but specialized for collecting credit/debit card information. It manages multiple UITextFields under the hood to collect this information. It's designed to fit on a single line, and from a design perspective can be used anywhere a UITextField would be appropriate. + */ +@interface PSTCKPaymentCardTextField : UIControl + +/** + * @see PSTCKPaymentCardTextFieldDelegate + */ +@property(nonatomic, weak, nullable) IBOutlet id delegate; + +/** + * The font used in each child field. Default is [UIFont systemFontOfSize:18]. Set this property to nil to reset to the default. + */ +@property(nonatomic, copy, null_resettable) UIFont *font UI_APPEARANCE_SELECTOR; + +/** + * The text color to be used when entering valid text. Default is [UIColor blackColor]. Set this property to nil to reset to the default. + */ +@property(nonatomic, copy, null_resettable) UIColor *textColor UI_APPEARANCE_SELECTOR; + +/** + * The text color to be used when the user has entered invalid information, such as an invalid card number. Default is [UIColor redColor]. Set this property to nil to reset to the default. + */ +@property(nonatomic, copy, null_resettable) UIColor *textErrorColor UI_APPEARANCE_SELECTOR; + +/** + * The text placeholder color used in each child field. Default is [UIColor lightGreyColor]. Set this property to nil to reset to the default. On iOS 7 and above, this will also set the color of the card placeholder icon. + */ +@property(nonatomic, copy, null_resettable) UIColor *placeholderColor UI_APPEARANCE_SELECTOR; + +/** + * The placeholder for the card number field. Default is @"1234567812345678". If this is set to something that resembles a card number, it will automatically format it as such (in other words, you don't need to add spaces to this string). + */ +@property(nonatomic, copy, nullable) NSString *numberPlaceholder; + +/** + * The placeholder for the expiration field. Defaults to @"MM/YY". + */ +@property(nonatomic, copy, nullable) NSString *expirationPlaceholder; + +/** + * The placeholder for the cvc field. Defaults to @"CVC". + */ +@property(nonatomic, copy, nullable) NSString *cvcPlaceholder; + +/** + * The cursor color for the field. This is a proxy for the view's tintColor property, exposed for clarity only (in other words, calling setCursorColor is identical to calling setTintColor). + */ +@property(nonatomic, copy, null_resettable) UIColor *cursorColor UI_APPEARANCE_SELECTOR; + +/** + * The border color for the field. Default is [UIColor lightGreyColor]. Can be nil (in which case no border will be drawn). + */ +@property(nonatomic, copy, nullable) UIColor *borderColor UI_APPEARANCE_SELECTOR; + +/** + * The width of the field's border. Default is 1.0. + */ +@property(nonatomic, assign) CGFloat borderWidth UI_APPEARANCE_SELECTOR; + +/** + * The corner radius for the field's border. Default is 5.0. + */ +@property(nonatomic, assign) CGFloat cornerRadius UI_APPEARANCE_SELECTOR; + +/** + * The keyboard appearance for the field. Default is UIKeyboardAppearanceDefault. + */ +@property(nonatomic, assign) UIKeyboardAppearance keyboardAppearance UI_APPEARANCE_SELECTOR; + +/** + * This behaves identically to setting the inputAccessoryView for each child text field. + */ +@property(nonatomic, strong, nullable) UIView *inputAccessoryView; + +/** + * The curent brand image displayed in the receiver. + */ +@property (nonatomic, readonly, nullable) UIImage *brandImage; + +/** + * Causes the text field to begin editing. Presents the keyboard. + * + * @return Whether or not the text field successfully began editing. + * @see UIResponder + */ +- (BOOL)becomeFirstResponder; + +/** + * Causes the text field to stop editing. Dismisses the keyboard. + * + * @return Whether or not the field successfully stopped editing. + * @see UIResponder + */ +- (BOOL)resignFirstResponder; + +/** + * Resets all of the contents of all of the fields. If the field is currently being edited, the number field will become selected. + */ +- (void)clear; + +/** + * Returns the cvc image used for a card brand. + * Override this method in a subclass if you would like to provide custom images. + * @param cardBrand The brand of card entered. + * @return The cvc image used for a card brand. + */ ++ (nullable UIImage *)cvcImageForCardBrand:(PSTCKCardBrand)cardBrand; + +/** + * Returns the brand image used for a card brand. + * Override this method in a subclass if you would like to provide custom images. + * @param cardBrand The brand of card entered. + * @return The brand image used for a card brand. + */ ++ (nullable UIImage *)brandImageForCardBrand:(PSTCKCardBrand)cardBrand; + +/** + * Returns the rectangle in which the receiver draws its brand image. + * @param bounds The bounding rectangle of the receiver. + * @return the rectangle in which the receiver draws its brand image. + */ +- (CGRect)brandImageRectForBounds:(CGRect)bounds; + +/** + * Returns the rectangle in which the receiver draws the text fields. + * @param bounds The bounding rectangle of the receiver. + * @return The rectangle in which the receiver draws the text fields. + */ +- (CGRect)fieldsRectForBounds:(CGRect)bounds; + +/** + * Returns the rectangle in which the receiver draws its number field. + * @param bounds The bounding rectangle of the receiver. + * @return the rectangle in which the receiver draws its number field. + */ +- (CGRect)numberFieldRectForBounds:(CGRect)bounds; + +/** + * Returns the rectangle in which the receiver draws its cvc field. + * @param bounds The bounding rectangle of the receiver. + * @return the rectangle in which the receiver draws its cvc field. + */ +- (CGRect)cvcFieldRectForBounds:(CGRect)bounds; + +/** + * Returns the rectangle in which the receiver draws its expiration field. + * @param bounds The bounding rectangle of the receiver. + * @return the rectangle in which the receiver draws its expiration field. + */ +- (CGRect)expirationFieldRectForBounds:(CGRect)bounds; + +/** + * Whether or not the form currently contains a valid card number, expiration date, and CVC. + * @see PSTCKCardValidator + */ +@property(nonatomic, readonly, getter=isValid)BOOL valid; + +/** + * Enable/disable selecting or editing the field. Useful when submitting card details to Paystack. + */ +@property(nonatomic, getter=isEnabled) BOOL enabled; + +/** + * The current card number displayed by the field. May or may not be valid, unless isValid is true, in which case it is guaranteed to be valid. + */ +@property(nonatomic, readonly, nullable) NSString *cardNumber; + +/** + * The current expiration month displayed by the field (1 = January, etc). May or may not be valid, unless isValid is true, in which case it is guaranteed to be valid. + */ +@property(nonatomic, readonly) NSUInteger expirationMonth; + +/** + * The current expiration year displayed by the field, modulo 100 (e.g. the year 2015 will be represented as 15). May or may not be valid, unless isValid is true, in which case it is guaranteed to be valid. + */ +@property(nonatomic, readonly) NSUInteger expirationYear; + +/** + * The current card CVC displayed by the field. May or may not be valid, unless isValid is true, in which case it is guaranteed to be valid. + */ +@property(nonatomic, readonly, nullable) NSString *cvc; + +/** + * Convenience property for creating an PSTCKCardParams from the currently entered information + * or programmatically setting the field's contents. For example, if you're using another library + * to scan your user's credit card with a camera, you can assemble that data into an PSTCKCardParams + * object and set this property to that object to prefill the fields you've collected. + */ +@property(nonatomic, readwrite, nonnull) PSTCKCardParams *cardParams; + +@end diff --git a/Paystack/PublicHeaders/UI/UIImage+Paystack.h b/Paystack/PublicHeaders/UI/UIImage+Paystack.h new file mode 100644 index 0000000..1f00a7d --- /dev/null +++ b/Paystack/PublicHeaders/UI/UIImage+Paystack.h @@ -0,0 +1,25 @@ +// +// UIImage+Paystack.h +// Paystack +// + +#import +#import "PSTCKCardBrand.h" + +@interface UIImage (Paystack) + ++ (nonnull UIImage *)pstck_amexCardImage; ++ (nonnull UIImage *)pstck_dinersClubCardImage; ++ (nonnull UIImage *)pstck_discoverCardImage; ++ (nonnull UIImage *)pstck_jcbCardImage; ++ (nonnull UIImage *)pstck_masterCardCardImage; ++ (nonnull UIImage *)pstck_visaCardImage; ++ (nonnull UIImage *)pstck_unknownCardCardImage; + ++ (nullable UIImage *)pstck_brandImageForCardBrand:(PSTCKCardBrand)brand; ++ (nullable UIImage *)pstck_cvcImageForCardBrand:(PSTCKCardBrand)brand; ++ (nullable UIImage *)pstck_safeImageNamed:(nonnull NSString *)imageName; + +@end + +void linkUIImageCategory(void); diff --git a/Paystack/RSA/PSTCKRSA.h b/Paystack/RSA/PSTCKRSA.h new file mode 100644 index 0000000..cc146a7 --- /dev/null +++ b/Paystack/RSA/PSTCKRSA.h @@ -0,0 +1,14 @@ +// +// PSTCKRSA.h +// Paystack +// +// Created by Ibrahim Lawal on Feb/27/2016. +// Copyright © 2016 Paystack, Inc. All rights reserved. +// +#import + + +@interface PSTCKRSA : NSObject ++ (nullable NSString *)encryptRSA:(nonnull NSString *)plainTextString; +@end + diff --git a/Paystack/RSA/PSTCKRSA.m b/Paystack/RSA/PSTCKRSA.m new file mode 100644 index 0000000..07fb573 --- /dev/null +++ b/Paystack/RSA/PSTCKRSA.m @@ -0,0 +1,149 @@ +// +// PSTCKRSA.m +// Paystack +// +// Created by Ibrahim Lawal on Feb/27/2016. +// Copyright © 2016 Paystack, Inc. All rights reserved. +// + +#import "PSTCKRSA.h" + +extern OSStatus SecKeyEncrypt( + SecKeyRef key, + SecPadding padding, + const uint8_t *plainText, + size_t plainTextLen, + uint8_t *cipherText, + size_t *cipherTextLen) +__OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_2_0) __attribute__((weak_import)); + +@implementation PSTCKRSA + ++ (NSData *)stripPublicKeyHeader:(NSData *)d_key +{ + // Skip ASN.1 public key header + if (d_key == nil) return(nil); + + unsigned long len = [d_key length]; + if (!len) return(nil); + + unsigned char *c_key = (unsigned char *)[d_key bytes]; + unsigned int idx = 0; + + if (c_key[idx++] != 0x30) return(nil); + + if (c_key[idx] > 0x80) idx += c_key[idx] - 0x80 + 1; + else idx++; + + // PKCS #1 rsaEncryption szOID_RSA_RSA + static unsigned char seqiod[] = + { 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x01, 0x05, 0x00 }; + if (memcmp(&c_key[idx], seqiod, 15)) return(nil); + + idx += 15; + + if (c_key[idx++] != 0x03) return(nil); + + if (c_key[idx] > 0x80) idx += c_key[idx] - 0x80 + 1; + else idx++; + + if (c_key[idx++] != '\0') return(nil); + + // Now make a new NSData from this buffer + return([NSData dataWithBytes:&c_key[idx] length:len - idx]); +} + + ++(NSString *)encryptRSA:(NSString *)plainTextString { + + NSString *key = @"-----BEGIN PUBLIC KEY-----\n" + "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBANIsL+RHqfkBiKGn/D1y1QnNrMkKzxWP\n" + "2wkeSokw2OJrCI+d6YGJPrHHx+nmb/Qn885/R01Gw6d7M824qofmCvkCAwEAAQ==\n" + "-----END PUBLIC KEY-----"; + NSString *s_key = [NSString string]; + NSArray *a_key = [key componentsSeparatedByString:@"\n"]; + BOOL f_key = FALSE; + + for (NSString *a_line in a_key) { + if ([a_line isEqualToString:@"-----BEGIN PUBLIC KEY-----"]) { + f_key = TRUE; + } + else if ([a_line isEqualToString:@"-----END PUBLIC KEY-----"]) { + f_key = FALSE; + } + else if (f_key) { + s_key = [s_key stringByAppendingString:a_line]; + } + } + // NSLog(@"Key length = %lu",(unsigned long)s_key.length); + if (s_key.length == 0) return nil; + + // This will be base64 encoded, decode it. + NSData *d_key = [[NSData alloc] initWithBase64EncodedString:s_key options:0]; + d_key = [self stripPublicKeyHeader:d_key]; + if (d_key == nil) return nil; + //NSLog(@"Dkey wasn't nil"); + + // NSData *d_tag = [NSData dataWithBytes:[tag UTF8String] length:[tag length]]; + + // Delete any old lingering key with the same tag + NSMutableDictionary *publicKey = [[NSMutableDictionary alloc] init]; + [publicKey setObject:(id) kSecClassKey forKey:(id)kSecClass]; + [publicKey setObject:(id) kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType]; + // [publicKey setObject:d_tag forKey:(id)kSecAttrApplicationTag]; + SecItemDelete((CFDictionaryRef)publicKey); + + CFTypeRef persistKey = nil; + + // Add persistent version of the key to system keychain + [publicKey setObject:d_key forKey:(id)kSecValueData]; + [publicKey setObject:(id) kSecAttrKeyClassPublic forKey:(id) + kSecAttrKeyClass]; + [publicKey setObject:[NSNumber numberWithBool:YES] forKey:(id) + kSecReturnPersistentRef]; + + OSStatus secStatus = SecItemAdd((CFDictionaryRef)publicKey, &persistKey); + if (persistKey != nil) CFRelease(persistKey); + + if ((secStatus != noErr) && (secStatus != errSecDuplicateItem)) { + return(FALSE); + } + + // Now fetch the SecKeyRef version of the key + SecKeyRef keyRef = nil; + + [publicKey removeObjectForKey:(id)kSecValueData]; + [publicKey removeObjectForKey:(id)kSecReturnPersistentRef]; + [publicKey setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecReturnRef + ]; + [publicKey setObject:(id) kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType]; + secStatus = SecItemCopyMatching((CFDictionaryRef)publicKey, + (CFTypeRef *)&keyRef); + + + if (keyRef == nil){ + //NSLog(@"No key"); + return nil; + } + + // Add to our pseudo keychain + // [keyRefs addObject:[NSValue valueWithBytes:&keyRef objCType:@encode( + // SecKeyRef)]]; + // + + size_t cipherBufferSize = SecKeyGetBlockSize(keyRef); + uint8_t *cipherBuffer = malloc(cipherBufferSize); + uint8_t *nonce = (uint8_t *)[plainTextString UTF8String]; + + SecKeyEncrypt(keyRef, + kSecPaddingPKCS1, + nonce, + strlen( (char*)nonce ), + &cipherBuffer[0], + &cipherBufferSize); + NSData *encryptedData = [NSData dataWithBytes:cipherBuffer length:cipherBufferSize]; + return [encryptedData base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)0]; +} + +@end diff --git a/Paystack/Resources/Images/pstck_card_amex.png b/Paystack/Resources/Images/pstck_card_amex.png new file mode 100644 index 0000000000000000000000000000000000000000..cc0a610f742944519d46d70a1f9115a2881efa08 GIT binary patch literal 659 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Ev!3-pC`=74`QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fI)jZzWuhCcSUphg^xe}=+C;OHub{ipMMrzdfk5X z>8-cl<2T+}f8$;B`r8hRu6_OWcf-whufG0@Sa-X0&%^C^-iNHY6~6Y?vMX==SKc(7 zed*Vqe^vV)c`UpB;m4oIb+<3Q{MvZv$*HHG6F1$ReCox7lg~rf+{)c?KX~=66<6QP zKKD{_@_C&Z7q7hfR=xkxop(R%7G71Ea>07R)wUx~mtF?C>u<`IyPDH4*6e>g43 zF-{U~b33NCOepP{*rI8djKZ#63o@Itt;{2DLwHF+$(ACcVzFt{7@hL+#AU~=4LlM$;)8iuHY?I+Pf9#Lk3S*KbLh*2~7ZA<2X?O literal 0 HcmV?d00001 diff --git a/Paystack/Resources/Images/pstck_card_amex@2x.png b/Paystack/Resources/Images/pstck_card_amex@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..04feb23eeb7ba59f5754eaeeae505f06752552c2 GIT binary patch literal 1062 zcmV+>1ljwEP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0004x zP)t-s0000Tk(CGD1s@W=+(M6=!sMYMQ*zV@@`i#fs zUa;Jk&FMy^*T&=Xb-dxJ)$A>q(RaP#uh{O0#pU$+{p9lbS+3i$+3rB1)}GMnW3%1y z`1~i9(DwWNdcNY`@Ax>L)RD^P;qdr7pw;j9{3DdlfWhQCpVY(R^4#wC^ZERQ!{kDv z*0 zYBJNF^PBa)$}*B)foJySv-i zBRBW-svr9@=$F>L7#QS`84e7yA6e}4fDHCa^$08vI4~kfkHQ?|a4K_3&1CGYlS6iu=*6wo@X%6K{pgwbDS4=DTS}_`i%ff zz*{On?ZN`wUQU_z3fEI%z#NCr&eaWv@31C7_ab_J0e-TWXz?GRLXPi40PBN4&QW}1 zbaJ26lW2VY8~CD1zT#VSfByULcOn0yR$u2$pc>#Gj<#d~sQPeC#0P@Md(|Hpn%1Z{ gRo>mCC$yT$Pnf-P-iid&7XSbN07*qoM6N<$g36dP`2YX_ literal 0 HcmV?d00001 diff --git a/Paystack/Resources/Images/pstck_card_amex@3x.png b/Paystack/Resources/Images/pstck_card_amex@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a2a34960d2ec1ba155fba9c295aa64d734caac93 GIT binary patch literal 1523 zcmb7@`#%$U7{|Xex(p>Juj8fMR=E`2kXwb*mfMLNs8oDr^HGpqLWJ|D-yXU zp(IL{LZaQ+Y#75Xwz17^HnurCf5Lgap3n1seV*s@r&U2iW$fSTcI z?Oy{`_ga|$eKj=CdmQlqpgvPu5uv5_W@o(ujsS4e0szcC0G8Av%p?GR?gl^*4uDHO z0Kdi+w4nC`prMEQJrJo57-tjySHW|MQ_|&?l@-;>idXr-GXh_sQiawHA1J0~b@R?Q zj+FIHZOJ8y7MGoi`nNwJ)29~S4~tE*37=Uri_1!zd~!_FD22a36-q6zq?X%Av3? zwS$w`Hj(p#*EB3P%^{4>$fKJ^k);DJMg7~bq-p7L3sYj2L)`t8;`)O6!H^J z(~U#os~^Ws)DD?HCXR?@ofC7HK8%JpFyGKcvvS43V(L=@zm6d)Bnl$mjl{LEoSye{ z=a%dX`ks>nqhi@k9L1-CE?ri(v1V*>WSK(QIyz&ON19(!9xA0ZGbJSypivja zLEo@wF$q6Gnq1iPj8aXT&i}~|t{o~O3AW~v2)y|jnc_z4_@nQ1$|*jY5j!ElE}`!W!BK93yAzNiA=nxxc`mwk|KOXoA$1tH!ws2uLk$Op!Ra- z-AickEv(pP*04w>SXjE-&L&PSR8gmj$-?jKxsW$Q15;8&DeYFA!k-R1xj(Pj? zk@7kfazi$nZ10QoL>`WkXX5NmiqpB@qGXv4oo?uw?dEWT)e7QDG&|?dCy7V1Z3}uZ=Be zXs~rwjp)BJF+1MjIYK!{I+ldb;_PeHGoVKhxv>|E>zdMvj)5H+n4pqSom^SW-=P<9 z54q9sAtSR!cgNKnd_4AT&aFwjMU`wDCyivt8RtdSEOVIf#C;d$9k2 zL-)AbeEdtXQQUz8`Pg18%|9Wfi@DVZ1+Y6CMt&HCI=By-ITkcI8-D>Ja6L6Kl6FfU zvwSMU7V$L+pOPAoX($PPdQDQ@UC)O;2mVlLO}rMVLmo#)RhY8;XX}D5#yGTlCzWg0 zHQ(W#GB7DdpRT&LHqJgRRf&Q;ypkUF0a?<8tt059R^tts1wdI= zu=uurBph;;~ zfdZD;vn%&j%4>fO7MhS!1?n|F@9^|oj}9u+-+KwaK1`5Asa$zSroMqEf4sE{BW#LQ z?ihmwB!8!{#s6G{uDX5rll(`amDK}%nA6_5!;{ITOA+pddaDfKjRW+owzO2mc60U< zbMrRBo^6}1n`2`Ff*R1rqm5LYGS;V3hO@uV!}Nhq8+Ckxk|C3^mvHf#_kXIN2zVp? K5VgOB-~AU7JR~&$ literal 0 HcmV?d00001 diff --git a/Paystack/Resources/Images/pstck_card_cvc.png b/Paystack/Resources/Images/pstck_card_cvc.png new file mode 100644 index 0000000000000000000000000000000000000000..03f416aec9035bf1b34fc85c8af84053339d4c5c GIT binary patch literal 764 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Ev!3-pC`=74`QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIF8#-}HM)n`r4jV~KFZgP%1BXh$y?Qx6IAwx!SbAEk(b8$V^nmA};8P3s0XgWzw`sQv}2huXAt<D{o!ukaqi>6GG zd=m0xqozP$YCv%Mg$q|MUAuVo@G^({2QHkLaq!5MGj|SM;+oyWk(n(W&BkVGUCr*U z{zlDW_l{jNcWWC~R3y!KaP-mH17xc>B3<~ zbP0l+XkK Drttsa literal 0 HcmV?d00001 diff --git a/Paystack/Resources/Images/pstck_card_cvc@2x.png b/Paystack/Resources/Images/pstck_card_cvc@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7f47afe7d74df6ff1af90da8863a09cf76189e43 GIT binary patch literal 1537 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBI!3-oT1$b@)DVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a!@$7g5a1Ky3RKY8){h5u zboJp!4}5%(5kxVv2-Vp@HzNaN^O40d*;1UG*F8Pq>M<1{i=1_J1*$|A!DK^>!W73N zvcl35m$BR|EV!f~2D(c~;4v8(iMV8sySU(zmEq!o#6H9?m?UP}0IC7TGQ_EDhH*cD zw(czn@(X4VxAgSY@K$71Qu(zx&r+QIeZ8p2a^1##&wl>Nv^`|UG2`F6sXlUSJQ@PW zzPGi06XZN`Ux#b@W0{$z?TkEZ(u#-m-tzlz4H0W!IB&A4O#OHLhA9f0TBoVYRtPZH zEb^U|DYYU@f4V`R-G14e8T_egwmN3pxVxKpyV5v#1=mJcOqFn|P;=SaP#4LX!KECn zSyWh1+!NrVZLQSe?d9QCQoqb>rJuvxiM@v9Y-;wmrKD%y6JqsIknl2M|Ft%_6__a) z7?Zr+T^Kr8Wj%l#&H|6fVg?3oArNM~bhqvgFx!NBx;Tb-98XS=Flm_BIkPq6z?mZ* z>*i0bxGQj=E6tu;+M502xu*%~$&RJW!rbbacF&R$ogNx*o{(UFgIDK_Mva(Q5VNfB z@i?Oc4H5^=9zK0sU*W*{m{BGm+mcJyqfj-%a`vjn<*S+ za9&({Ozi}d+Ogj~KAr{#a^~-3UDeV0)6V-5?}X4x8=b^AUkab3ev4se?KOo{$FA|Y z+_G-aV7pt}cSP#Jmh(4RU3Tx3qYQC0c-hmpaLpX_hARW3Cws6D8lr6Q8z5K-Zh zGR42dCnx8QU7-^1gd5`gDsP2^8rf7-mm3%?S+=x2C1usS(@K{ZPS)OZFj6YcJ~0VYOqqH-BqS{K{bZ$E4N`5lc2%*hVC3zc z=gY%$HdWU}T4CqOtFEZ3d7A9AiNKN-}PdRq8U zZP=QaqYpOD>S$pxYslqoery-(asdd(rlz@GN|TE2tm z%^h|3)hyZzuCnO_m_61E=vWc6J>&i5>(08Dwkf1^uDo}!HEYAFTi4cRtvdLkRqG+! zv2Aa8cs`vt`pe4XbGgA=m4qYf?oQ}RJujytdYXZWq54zE^CcH1d4qDWr>mdKI;Vst E08PdfTL1t6 literal 0 HcmV?d00001 diff --git a/Paystack/Resources/Images/pstck_card_cvc@3x.png b/Paystack/Resources/Images/pstck_card_cvc@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..a0bb31dea9b0aa39276f7c7d5faaa7ef67b0e648 GIT binary patch literal 2221 zcmeAS@N?(olHy`uVBq!ia0vp^2|#Sa!3-qVarw6aDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a!@$7wF~BFp6{w)Gt)C>+ z(bY#hdf?-Oh9G*81u;dCWvR;s`WGv>@8g4298++ixjCjFnuwW@5X9MN;#j$G50W7Z z*Mi>=WMyzRoB`AeXG0ihA|mYUXbORvTs&+@GDB7XvsZwUg?L(^22>Bh~18Rs2k zKSxGdZn$;e#K}{qj-GA4T<_9m#BVOHt*verJfq>+=OAUZ%0@GTM8W6DsZW=+{p8`f zvt~_AL`&n#_I4|=4;wapN)}{u<7<7$&)l-$HrrG)1pb6x?cH*il(Z%vdVN$ z*ZF+)ier?i$<{ihhH1;puIgO4$eMNK^8Zdg9-hu~bu5h&H*%iv2sSR}_Ga_uE;bGp zxPIhDhnHAHBy;cPja!|CHid6u?23#IJj%rGz97=?T*jhvdJci^;aU+7p7Her^Xmx7 z9f&9|UwnhffBk&>y|o*>epdYd^YXRlN>(rX`d>dEPx$=(_s`%?CvKj`m&cixuVFXP zUAQFdlCHszpO;ztO$?UtYHV_lo?(~xQeDA-;}8cQCogxq!Cd9Ke=g@Pt3)sO`FXkS z6iG=@S>|o(W_osthMJN`{5*YuW=>|}7HQbXaXS8`WCFL*=1q?`6%~E{bhx2RR78yN zvV-AIu_+2oJGQKm$#HZ|En{VN4lVW7Wp<9OEoC;CBz1E8f|t+Fr*W)aYPyOy$I&m< zy5oM}Wyy0Bg6|)_@aJ>7`A@MgfBxL$PW$rJe})BT&cP?AA|@P|GV9+;p3AS68_)Rv z$FjMGJMG^eOYSo>Y}56ak2F<&7H?n?yQY(r5D~M#CGpz%`Q9hDGen3rBp2MA^Hh6* zn8SfhQ%zS(NQ7Na|GJh@?D3Om1|0*(kSDiF4}^549Q-qD&o(=@wy$4XrOp2R+1Z&S zpL1{11jdt1Yi|n)JzvML(Th8ITksR+44F4KcCKEXU7A;N=$)-Y+^2g#_SDW4VExT6 zvqXb$!OD!|)8-amo0{q(Z&lOM_%I{n%Clq+)hSDrGVCnuYO69|cFuUQXYz6hzxgNa zZnIC-J8R|cXZOI8|K+n-hm$8aSZJ&`V?A|FP2t~P-Vb@Ezvf=gQ2Z%WNOuR@TlYA3 z-EIXjmOCrX^f8H*Rhs^F~7Q7ko?6{mhr@9iyIrrc<(6Qo|gabN%eQ` z#+Moo4mulo1@Bto`_?REDY$)wb#d-5ndsY7 z_8gob{@_~aWp9;*(|sRY`^sIiG==ZEgz3TG>_>TyialE&x1aGV|15*w>^wG0_&q-E zWqoCQj4F*qFKbLh*2~7YM%{5;D literal 0 HcmV?d00001 diff --git a/Paystack/Resources/Images/pstck_card_cvc_amex.png b/Paystack/Resources/Images/pstck_card_cvc_amex.png new file mode 100644 index 0000000000000000000000000000000000000000..0297caf7efee0ac7738ef138602de4b493422d2a GIT binary patch literal 750 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Ev!3-pC`=74`QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fI*-pUw`3fjh=-yVlMNSzmR3CoRG`pYE>-%G*hXkoHx?zXLs#NpB#DX8P!F)cJm+JbDf&* z;=^NLRlaZEG@#*(N#5=*3>~bp9zYIffk$L90|U1Z2s2)~TlWVj_{r17F+}5ha)JVr zfsx^61?Dg_wlcnR4t{)PE11;u@7_SF1gYGV3Rv&SaEZnMCwiHDRHB}9d|Nce1C zaI(A8yFtTKlPxgQFo(+`MIz;?#1m1GsZ&BjHfjb0U%zlA>B6;(S1+3z99gCiaN)#_ zmPW^GSI*oyB($3|?3&rOs7$g>y6qOa0Ht#$r%hh;-`2~02il7$# zrUe2{37qUI!gnNXD);=@bCvb#-k*CaHn53ktO?=O2`*tjn);cfBu$fEupaY|^urjkCFy#qJ`llUvd=2P(22WQ%mvv4F FO#lI`@<{*y literal 0 HcmV?d00001 diff --git a/Paystack/Resources/Images/pstck_card_cvc_amex@2x.png b/Paystack/Resources/Images/pstck_card_cvc_amex@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..68bee40cce67f2f3df4a1e828f4cae4620919c9b GIT binary patch literal 1515 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 literal 0 HcmV?d00001 diff --git a/Paystack/Resources/Images/pstck_card_discover@2x.png b/Paystack/Resources/Images/pstck_card_discover@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1fd9d2a1f84a0a6c102ce4f8dd7bb87a97b88be6 GIT binary patch literal 1224 zcmV;(1ULJMP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0006a zP)t-s0002+^7ZiY_3-lb@bdNW^7ZiY_40QT@^=#QcM|e<67cf%@bdNYcM|aO_2}vB z@A358-Qe)>@$l*7FfcJcKtOSFbJ*G3Qd3lljEz%NRY*ul$jZ&Kv$jS?M>aM$y1c&d z^7Qeyi1L3R@^=#Qepvpj*pR8SXqOFhKGoWKtVyq$I4DmP>YO?@a5j{=;L2t zVRmUQyqUY)BaB*^GW@u<=YVv&@@_rvTH#oStyYBGw zw6(ZfTwO;;NapD3dwhPUsH)J?)VH|0@v?vMwuac+-Q3>cm6n)pZ*Z!tuG!n(Gcz=~ zyS?!7^6{~K@_ZZdw1bF>i|Xv}>Fe(B@9^;C+vMiy@Z{R@omlYf>hZON@_Zcd?(Olt zl=6Zm@ayRC-_r4|b@F~5@yV(2mQ3<@6Y%l#@YKEWs&DdvCGgk7@vV09gevjLs_~^~ z@`ESvu<^5j@tRWr002VDVk!Ut01k9gPE!C)zVl3k^7Fn; zgiiGI*v#zg00001VoOIv0Eh)0NB{r;32;bRa{vGf5&!@T5&_cPe*6Fc0qIFZK~zY` zV_+CGfRTxrk7&Tm#DcD$m3Z9{z>2D$g;f1~e2gdtFp+Km6N&+Bq#MA7VgTv-`S?Z+ z81@G6g9rgZ5G5omM6>}SBBEmAd=ir4QXzD7`Fj@v2hZT7V*&uiAl*okrWjO zNKH%k&B$~W@l?;!vC7WL#chDAXP$&4A76fUL17Wd1;t?fB|_n)PRV?(B4vDhI-c5r zToZ9)q zGekN%ySjT+f_l67`1%6)fChkKA(}6@BauKl=obe$vRrTikeoOPoDTRW53!_74+Ex5 zrO1G3(`TqqV8F~-vw^9DYy;*v%mybfG7XqJZ$31GkYj+*f`yAzRInL9Ox3n{$XpaB3xfVs8CyCpBq^`{Bpu&Qnv``WPB!C2gp#+dn6l7RH0U23J=pYFqFcz8= zDI!La8HlL#F1-hkE=UOFdp~h)=xpZfIs0RO?K$_k&wcKB?zw;NO|!GL+$VKZ3IMQ= zOd{F~nI;5ILPVHZQj}yN?eW8(#{VFKL>>o#o(RBaVT-;7K)5CV z>ofoi?g4NlB>(vZ901rBI~zxHp#eeP|3867$ox+Tr~cddPc6)XO@uc+yS}kKH8VFj zJo=U|K=>=j5)awhG%_|e#p7LEsae^-F0ZV0cD-`(is_gdit80TIbH`UJDJI zTUg#g-sKfMu(TwdIir0&;ui$nfvp8-y6&IrZXAZW4hXNK`&B<4Pl!)QilxU#MaPmz zWLK(NMP-$~fuXs%MQ{I5TYHzigX7t==dJ_#LeAfb#2|n#kH}ym6?%gVrtsZ)UxuH z&tTqyb;)St5oB(-sJOJOywb_ZnMAe<3%|a$zNx2gP{*xDW0YXIf9CD%e*^{JWH8Ol zh;Z~Jnsh2AHm-kg*vI!$dBvl}#Szgz@92JQnsgez`zi< z#@~pGPn?*X4h;);c6K2U%#iVBG)cXrvq+ycN&=l%WR;oROK{TbWs}=N1be z6e9vY@@59v;6qjfY%4?)euRBb;qWsw+X4=7&@6Mu9zXs;oqrV(P7RS+~ z)5!7^e4c@3nj)+7upt}GwnQTiAoIiUjy3FO!^hXq6isAP0NF8UmKm}z3Oh?-RS244 zglr?o%q#fhIvT4Yyk4opyM97C8fI_n0I;r{^<#bfUMg3xy1To|rS@V~`Ko;@97!B6 zNa(_NTU!!As;DAKC?rEjuAu-(%lrw<$ZX6m03tLp5%1{Iw#obCW^+MS93iLQ{DITZ zU3tpv<)z&AG&{92vakGKiwWe3z$q@FxZ~&)m-Doz(RcpC#*05%^&^fZ8TQ-Ee))K* z(d2dgV1DTQV4u;4{2Qy?zN`0S(y4cx?AlyhCpbgS^V8+!(L(i?RFA4bo*yz}^Axby!#)gXmEkQ!U7`TVgrit~@Q%&C;R_`5jr}osIc;Yb| zfDKWY>}+^~EmE9R!Wo1SDNk*IRq&w_iXWKQ@Q{Rp3B}!dC8>#~6O)e>yJSGzj_laX zetM;p#a_Nhv8>n}PuE>>_`73m-+%c|!U;cS+S(PoKXH*Z?V-dlBV4VtD3uc%=EdkO zNhHvv8H|?93wu+`%yAYXj28A)03|gua{P7^iH@UN_YC%=vOM_v)n_um6xkKR3u zmY!N+NHNQ&yz0A#6~UyvE~xZ_73Yi-kEh*T}5jYoM@4qRvVHBY2-4X*wFlw z1xE5&u6VPm#sQyY&EAAycLz+hr~yI1QN1RcnRoYYMUm-g);#T_nzv78y1ZOX+QckF zA=)R%# zUB>coL7Coruunrrf@rC-rQ!WfCHVAZMZ%8QidTEJYGIg?g1T~?PxbcI{Q5ZYsE=u# zg~$Gm8-5u;x4pl3qQL>|o~_1tJu<2f)AyXDs^~_m%bdEr&?NG=5v()oGg*@8@xnGWv6;yV zWLb;l%#CRr9|4WrAc2#a8hzKW<51I)B@tG{_V>r+_J{w`Vn+BuM2Y!Nn{QS|n4;X+ z_6N9Vi*L+QK=Wj-4|=|gGEcPk1e!Or-@G5?q!20jdq8$ws7Aw$FBxl;gk&teZ>oFW zqYq`u#-DFjja0I2GzXHoW5&_n(AxDSo%1_mZ*@iU4A#`XZhk3HzGSj*{P=r?JpHpd c_kFBlFs&+{p)mhpzVHD7+1!@MBGBUh4Ygv3RR910 literal 0 HcmV?d00001 diff --git a/Paystack/Resources/Images/pstck_card_jcb.png b/Paystack/Resources/Images/pstck_card_jcb.png new file mode 100644 index 0000000000000000000000000000000000000000..0650910f90cf0c611776207b399c359697c4b99e GIT binary patch literal 555 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Ev!3-pC`=74`QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIo|ghP+kKmK&{h=ci&%>?eS)--sCp-Xx;AX6HexAzCHW* z-(M3>6zsqIdfA1?ciwzC{rJ6d_wL`Xp1t3&@Z;|F4=WQNez^Yq_t)NI*;n+~C0e#$ zvy(2~?Y{i%gXddT9lgI3=y=(jKuI9QSrX(I%pkYx=kEP~e#r;=aasTc8I!!-T^Kr8 zWj#PD3Opi<85p>QK$!8;-MT+O!Ofm7jv*T7doQK)H!BFRC4?Uj)e`l7D_8b@@A3ct zBhL!Xmf(I>+x(rgz|ut5`DGjDBqLs17BLMiai(C_Pl^KFlYBWEH#uvzcAb_ud{*PY z9EN8i2LG8|7_=C?ndV7_RPz3*T6~k~-n)|Oq65DxSmjv`2g>xEZ1Jy8FpJlDoUrv? zPWglP{KthqJgC{JC0F_R(k_pj&w2-(8004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00042 zP)t-s0002+^7ZiY_3-lb@bdNW^7ZiY_3-lb@bdNW^7ZiY_08bxP@%^UfV2d9vFz2+ z-E33UHWAb<2Hfe{lgV^#xj<*OH_YJc6N0tu)X>&C7I3;mO`pcyYf+QQbJjQ$aJoa) zG!EB07u7QjYq8P)|Nq-gE$*tC`sLvI=;ZRjw)gw=$mF(dxj+8+_u*|)-B&o_YftK# zhWX^*kjZSD&wKd%_Nms6^ToT=E(g^w323%B<@4R8)QRPOX4dS=;_=z~{P?}#scX1A zxZR?=-lp~X^6>cUmd$kwezTUx-s<%Ex80%i`taxS_>slkSflBe^{63Dng~dLR;&^?=eq2qVxa89+=nfF{BW_$bg!fjB!LQ9z~usa_zFOtzE)v?8Je zZS5U}Cw8V}KrLO}JzPL9VydryU~otU(&^z5#8EB)aco?jz=R4AGC74f%?ZpDhlrTT zWN~(GzH}g$TUf-UWouwX1y&K){=5QNN8GRmHn+BScJ~nXB{)DlJfcH9K0!RS2F}h4 z?TgE+YYA>{@3dpQFCODV_K|4@`6qgjo?jAG{w}MIDPRe(#{`tH+UzEv?B#0X2h8ie>>mt4s1e=lZMRq}R7}1B XufupHiE?x000000NkvXXu0mjfbsoIk literal 0 HcmV?d00001 diff --git a/Paystack/Resources/Images/pstck_card_jcb@3x.png b/Paystack/Resources/Images/pstck_card_jcb@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..dab7a5fbdf88d46cbbcb0e063aab7b7bd01fa895 GIT binary patch literal 1369 zcmb7?`#;lr9LGOQa~)1NoJvWKdOSKFN=qG=4n-_QE+M8CC(fy(bRkXH96V5(TPgRB zbjqW89L8AW(p)l^+;$^H=DO{>&Fo^c?d<#s=ka*I-p|MD{eJ!U%027vgD}`;002Os ze7%A+#AxKE2h;4g1_9X`=)`%R@dTiOV7Pf{i^ki;_y(N;0Ba8bE)xK`=7d`YAn^bI zs~7-Wo&aE(Q1LF%4FK(ZXHSQCYXX8b@&B4tzUVw4 z4@s;#WKri-=+P_+#vqkQLmJ1EJs3Y*OriEp`P$QunpIF|A&DH<&Sd%6tvteuhbc;t zP_0%=Xv5H(s+kBk*{0+(G*&i(eK9(p+cm|h&Q~eqstuX!Gfm3)q*z^AE=b{s*#a4- z{L{TnkzfJ$I~{4lJhpv4DN58sUM67wVU^N2{c5H1%LPxGlTl_*)Yu9|)Z2EW&FgMw zz`#PQQl%^y_=8hvG}7rZlB1 z$UK8&oZhr7lAWugPD7*hbi$fUQBIxpt?DzyHSf-S*UVg=yUKi zW}9~+Y4YV5du&lClqq!ff_#fFMqcoz$pCpE>r3tR- zN{g#=ac9PdD0UTr$f&_}M{osvr=kwlB82aboa4^rcQG?57d0hWcU11u!1Q*Ie=yKK z-?(Z!v@#gc!dcwhv+ye1n5_9}Mf>@9ft)SYz8a&S;CucS0ES!tlh*i5+NP#)H&I@m zA>kArQyOgMX|5~C9L=!1hO0%Fz`Szv_T6+Yuwe$q^j^qtmt zfthmm{y`|ewwUjDhj>SE>`+^2<-jfSc!SxU?7hVa_7lZ(r26Vd!;w*bNsqmiI}VEV z2QC>v=s*oGzbOhsryg%NvI(#&=m+u~owXluALTtuNDq~cp1Jw=C@iL?^?B22It4Vb!|J?!C}X&hn_V$@)$14qTy*xQxkXE9m2R<^q_FCX9{vJ9=V@h(P2 zOR$renw_vc8$ciC1TR4f(zOxwE?1huF+<^HHvrN(|GM#svPk=;Ae+~J$A7ak#yFKc zIgWodF?$WGc<^-H$q!~*_>r4=&<6kpS+qDoJ3rcxPzdiD|0!G7uLt;*u0*!G>A%KV zhURI7KJBn|G0i{e8aBZxYmUYxT8%cQQBHnWKBOJpzDO zYIZwfZ82x*=o&oD4txJTYLNmp*ViM|>o+Rls+|HjOl*}rsM}8Qu!esTX>GBR;qU~s z$7P`PY@5zK`4H^h#;GBXmw8X{*T15u9)WWNa8Ubl-H*LJdL`=Dh^^Bgt^yvO9%HTE z110b87RKhx^LCV8M4zDYqx&4|>tX|c88hc{=J!K`(qxD7jFkf-!{GS{q literal 0 HcmV?d00001 diff --git a/Paystack/Resources/Images/pstck_card_mastercard.png b/Paystack/Resources/Images/pstck_card_mastercard.png new file mode 100644 index 0000000000000000000000000000000000000000..81ee9e908f57993c2a7a16977cbedf7253329370 GIT binary patch literal 944 zcmV;h15f;kP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0005k zP)t-s0000HNqrGXeGy505lMX!NqrGXeGy505lMX!Nqr(oc7#Vv#YZsZMkB*VF@Q%- zBvE*XeqPRT_;m_SV&*qMkVV;Amvgg?vyP8^% zVkz~EHua4*`K3Pjut8aAY9mQ?-$o_tNFnfMD)4D5@og;msz2{2f8YE1X8k@0jo^N3dQZZh(JO82aR{`2De%YpmAX!^BH z`?^{CxmWzslGwF-gM>uw)@u3^p$`7;oJGk!StDg{NdF4%((i|z4^eV``gU> z+|By2L;T2l{_D^E;=2Cp&i?M!{`TqZwO{FALi*Cl`N_Td(a8GF#Qf#p^O1V@xvTol zyZhS9`pvld$+PvHb^F-J{_olT>dgJxr~J{7?5jxAcxd*no%X1f_`I+C+0psS!1%tf z{psQOxSIRd#`1wp`_Q-k>C67^*Zt?k{_)-Z?bOYjP3>1D^@}xzeP1L=b?i+d^@%n1 zk2m_QK0>PPqCW1cL|sSEk^&D; zFK-`TKmUNhpx}_uu<(e;sOXqjBn5Ht35iL`DXD4c8JStxvXMEtdHJ~oND2yzic3n9 z%E~J$t1_!=Y9s3Eof;aOusE_=8wgsUj%-Cz&<6Epdxx@eXBRZ61h55Ex3+c zLXxwuAEIKyM2P&P$w)yBi>xVAr%mS)pD}aRtl6lMMKHPdJut literal 0 HcmV?d00001 diff --git a/Paystack/Resources/Images/pstck_card_mastercard@2x.png b/Paystack/Resources/Images/pstck_card_mastercard@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..137c3d7c12b0452541dc27bf74c954e76411cde7 GIT binary patch literal 2018 zcmV<82Oao{P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv00000008+zyMF)x010qNS#tmY3labT3lag+-G2N400%}%L_t(&-tC%ua8zd* z#(&>Ad&^#O50?bZMnY(7J3}cU1|*?WY9WQe(Q&-A({a>lVLDn`XIh~GO1J&N-idY*32ql5;k7?bv7L%nTJ+Ey)bBB2)BRKBH<5UXS-74ib5a)?}_XbAf8&?`K=EvC~T{PZN) zOlJ9_d};P278edPH#bZ{Mhqzh0}(rCF1z__UlzOD3+N3xr;Ky5MNpa%{+Mxs6|x(Z zs*|@NaHKhZnB6++n1$){Hc=}i|eWA%45ooNvuGW+dxJ&l% ztZ@Vn5XQzvr4qH&%hsxM_#C>a_>q{6hnnW{=KDD*8K6umIsqP#XQ(&+Vp=?a z8;xzoVSZU~%(QrbOozsfd*0WThNW=?u(i6KnV#5x&wxjblep1R zkPp!lLqwV{$FHMKoKEoWS3>Kir0qkzFDB8l0W~6ugtl~ zPg{!V51A`jOdC)myHErOPZk(DG8{yBd>|BLI0#1a1x>hBqOBv>CsXJ`o$dt1j_?#B zBLgrVx-luCVspA#Q#!zlt%auan4SU^vLAKkr^$Qu6j|GTkML%a`^s_hUOk19TQD)| zHASYXB3y2K8|uMP7*G3_5h8D0H4U0C6KM$`^58H*6^LgYvXGWb5XhqI~%t^G707(a1@ zk$OYl6n0d-ahTIX4W(*>%E zcimlUDhtm{)QVcvo4$p}{0tZ|gewpI><;i1V|?%@ zk4wEiOavK8x^X5a2Hpbj ztArO?i>`YwQ88pXXBtE?>p6*Xy|PzcbDX{AOdum+6rT;>eVUps*`=zg}c%EP$}4Qg_U6Db|t!eR$ZQRI<%DY`q*V^Wy$Ofo0KGAc02@mRfF; zS#F3l2tUs#&VBL#DZ@~*w>Ly^{)BsYD=x71XI)%zJjaU;&bE>c|-sh#Kk$0%`q{Z*M*-C z612r@qF%BkKx(TwtXuJeqFO zQ;39haxw#srR?z;s|5AD@4Tgn*;K4+D+0+tW?v6Z|jZpVd6F%hyAr!vFvP07*qoM6N<$g2+a! AasU7T literal 0 HcmV?d00001 diff --git a/Paystack/Resources/Images/pstck_card_mastercard@3x.png b/Paystack/Resources/Images/pstck_card_mastercard@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..4a699ba532e67e5b9f822d90d91f83874031454b GIT binary patch literal 3236 zcmV;V3|sSwP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 WkC|VACtUFW0000Rt zPXT0ZVp4u-iLH_n$Rap^xU(cP4PjGWG1OZ?59)(t^bPe4^xgwn)C960Q{-OB%BnURX|O zpVD|kprijFkK1?E6VJ<6qxJNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N!u!z$3Dlfq`2Xgc%uT z&5>YWV2sQRi71Ki^|4CM&(%vz$xlkvtH>8?tx|+mh4pF`@Az(Bs?>EalY!TL7J+V6;g z0Pp^Jt{wpm0@{iZd=7^tEqHW!7cG2hP|YUA$Kc_y+v&muoi8=_b8<9~J>Iy@pyJv# zlfp+E)!*Cp3%mMVz7n*JiQDj(`1Ek;7nj@D9-5Z?*Z5;S!*S`HlDe{AN{K?O3_qE9 z?oDRW_+abM@>}5C0*16_{RSVn%ebrE7JLs_Fy~fdEo;TLg!T=tH+(gOmrPlsXa=EhQoS1nv?E4BP{mwx(@5fH5>$LZOSS(f2h-7hI+b)$Kv zT*-|FkHx~(cKutYFn&I9{c#BE2NlgV3)37Dh2LH5-N*VtOR{RQi0P4gNu`_`v(Bgl zWV5ME3=O<6i?K^hoAb&nM$eQ`ku7Nri%xnmZB26!iWFtlwPRis-@H;?I6nLMj^j}e z?1XE2(DtmVn( z+Bv`O&u83!eMfWO&KX*~Qb<&t;ucLK6TC@Mp#V literal 0 HcmV?d00001 diff --git a/Paystack/Resources/Images/pstck_card_placeholder@3x.png b/Paystack/Resources/Images/pstck_card_placeholder@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..0339c9386b5e5c66ff1ca1eda6a5d265fc031f18 GIT binary patch literal 473 zcmeAS@N?(olHy`uVBq!ia0vp^2|#Sa!3-qVarw6aDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C+1{@Ck7R(v5BXWFVl% zx2NCy2U5Z%L4LsujM8TAzFc;0wq9!7LgubM8s1#d(@TKTj7i?^E({&4vK~MVXMsm# zF#`j)5C}6~x?A@LD0th`#W5t}@Y@+@xmpZ(T5iAkaXoAG`~MrF1#TWz>-H8dP%NHv zxMqfn$KyFK#eZJ-nh|oJ_54%*MOY_;tDy8lU|6LZR^of<18ZBrSTB^sDl{6EQN z(7?!(0OUQWXZT&H%Xj>orEkNhIA6YVnM^f$_Den|G*oq7nO(EFXUpo}JyWYY_`f*E z{GGC(jwjIm`3{xx2}!eNF7eBHv*E{urRt zPXT0ZVp4u-iLH_n$Rap^xU(cP4PjGWG1OZ?59)(t^bPe4^x@@H^GYG$R39?9;rM=pBV)7S(4^3Jn>4KvuTR= z2FBhW%{e?Lrk`LCdGm##p!(wC2DxdAZx}w{b13AU;M}j_urc|7bHWwI#fk_ktr+!H)AtedCN-3?ahP7!0`u9~bp9zYIffk$L90|U1Z z2s2)~TlWVjIMvg|F~sBe+c0;&0}4FN7xupXZ@=yHg(cIMc-uY*Zc0gRno#)8{Da5> zw*@Yrf^DmvPyOWFwCBQY-A_F8)(Uvt?$j1|oh|V#-gZHnZG!Bsgb4Q?3S2h&1;3>h zJBV~J>2sUhzMY%0R?K2wU0l8DhTD0mf4>OmyF@4KwT!VATvylkJH4f%d0~kby*bH`XJ!K($l&Sf=d#Wzp$P!ge0bXc literal 0 HcmV?d00001 diff --git a/Paystack/Resources/Images/pstck_card_placeholder_template@3x.png b/Paystack/Resources/Images/pstck_card_placeholder_template@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..c84d9299d8026da8ef561a7be74fe9dbc02597d9 GIT binary patch literal 516 zcmeAS@N?(olHy`uVBq!ia0vp^2|#Sa!3-qVarw6aDVB6cUq=Rpjs4tz5?O(Kg=CK) zUj~LMH3o);76yi2K%s^g3=E|P3=FRl7#OT(FffQ0%-I!a1C$5}@Ck7R(o_c`4{CP+ z4V5kl@(X5Qirn-{>CDU1-|Cc^qrO^guYdjQPwUTLinUKeKlv^NDq~FYc6VXuV3qX% zaySb-B8wRqxP?HN@zUM8KS04}o-U3d5r^N-ILUR`fXC&nMfBU8+&LvP|NlQP=5%7= zrG*j8bTj&jXRuG=ozxRps}#LMs8cI8ap#{^e!llZ!hPzLC-a-A9Nc!`WV_zlQ?Vb^ z7c52z6`=-T-pZj^w z`0Vaur*t2gR|(E<*v)g`^7589$0xjbE+hPeFUZHZ`HE+6tDM>AJBqGU Y?+u+-bKK46AkfDQp00i_>zopr0Mclr5&!@I literal 0 HcmV?d00001 diff --git a/Paystack/Resources/Images/pstck_card_visa.png b/Paystack/Resources/Images/pstck_card_visa.png new file mode 100644 index 0000000000000000000000000000000000000000..94eb5477bd246b1e66690e60ea81e2efb0eddc09 GIT binary patch literal 650 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Ev!3-pC`=74`QY`6?zK#qG8~eHcB(ehe3dtTp zz6=aiY77hwEes65fIyaN+#Dmn$V6Pck=vG7azX=_|-mgR!;qfpv=YLxyufoyt8S~RriFszNrf@Tzj(T=&iLoF6(KXh`(hs3a}ZwL4ogV9$=-`~FWppt$_PnUV+g^_yqj?Q~nLWQy4FptE3Xtxj-+vKUFtWT#df2;gqN~Pzxrj#Gs4_LI*ef&3TuC!E!+P8&H|Om z(K0pejDG2Yde@^r|7%cB^=<$2f8oBykFFk literal 0 HcmV?d00001 diff --git a/Paystack/Resources/Images/pstck_card_visa@2x.png b/Paystack/Resources/Images/pstck_card_visa@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a5c3eeb02f4f9b89e95fdd209742f1c80392f4b5 GIT binary patch literal 1071 zcmV+~1kn45P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0004= zP)t-s0000jNsui`kS$4&ElH3qNsui`koT|6*y85yfRVc{N|52@?d0e0G*6V$*yh{c>OoqX=+bV9RF}QR+MTM(SZ=1Lvd>_3t9XjHO=Y2{v(L1?)|8^flAy$Be6DGIua~9A zP-mj4w9tN!x{8{>OJkqy@AE`moJC%oHc^#7SebK$w8qZgJy)1iYouRvs*9V!<>~LU zz13ZFso34=>h1F0;_JuG;4)5=xWd?mmcHNP?AhMw#LV7BUY*F$;8JO$RcocMy3>Z2 zzHx-JYk#nsr^s!Av7oKYyv5q4vd^Tj%`ZxkzQ)^dgR_~Y$miYNT6nsFR|_zsTI!-RRKPJMWxjqWu>diDK+FPE_yZ~|fWIFsfUH3O0X~45WVj(!6ri@Q9vT|Waw9ZF&5)K& zEt|Dxty?s>H3QrJUBUJp(6&>geHVngp*h;KccJN-eIolibaBA3g={BuiFCt3>49G9 zgWRG1fj-S0Hl!o2GdK#zM2^D=8HAH^YT?=F^cl|PIp+fCx6jKET*%5r=$B#W7`bFJ zmz8$~t~vl|E!osPBBOd_*W~&QbA)4>>4oG?sC58Rtu)-qlesN-prC=f_skg%NwSUm z@&F#X=3rbK2#-V_!-NS$PqdFMqWx)l`V59$fJt}`FGQx`r9>vAJDQrFS^A6fkpnPm z-pc9Z72uV;9)I)poestO4}b1~v}=^rNVkrSnVwYVqUmEzPU{K7@Dud709tVVv&a|t zD(&C26%^)1zr&0Uqm03z-_Ml&@pJy~nYDButPQ}g703cq`uo>efVe*(ZUGYhfP@7I ps(k%b!7{CnR~PTDjwgauqu=wk8rU5eF9HAn002ovPDHLkV1h$BA}Rm? literal 0 HcmV?d00001 diff --git a/Paystack/Resources/Images/pstck_card_visa@3x.png b/Paystack/Resources/Images/pstck_card_visa@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6b75ed884b7424722fd520d9a558d4e2f1b6270f GIT binary patch literal 1542 zcma)5_g4~n6#rsq&gV#NzdZKJEK6-rY0q$w3s3>pLG7ZyAG*{)w+=~(w7i#W3 zaNz<=bET;{GDAQ~apuWK$H)5*y65w`pYyrrbM8;~zO+Oe%SaxQ1OUjGniye(>Llbf z@jb#`E@=@V6sWsCN*{o#cqxIisL-ppnqW`>1e^pQ^aTJr!ciy}fX7+@EI9$7^BREt zgbbS1H2_3(ERi^bFmTp1;diiI27U*^Rjcb;T;5uD|7<;dyry-m=nFML2PE{$OOB%e)tMDEhwIrUf7$Q(?fjKaKkav{?S|Ft47|+hU=43O|wMK z(ki*=-5p}t%G#!9Sk=^*rEi=S=HOgv9>c;dM-Tr-*P7(=q{P~T>h!q8;1)Tnq%Vft zF*?b14=jgSrBX`!JVGk{Ue>RyZeGQuJ$YHLg-n{9T`aB}u4^AJZ~EBKF@e03eJ`kD zfy;joQW=`qJjYu0i>h}EDD!?%)6(;KVUeHl_T2?^avO6BaXZs1ta|h_hsEKyF{TE_ zSeScxsJl6Y=QTbNwOxI)*YR)C@)==CEsTLLZwh)7C|!%+*K}~C-0}|(LaVfqNjc^H z(dqR3$^k=ra$d!UN8z=Z#qVe5d1F(Y^XO!I@1nTO&gUtuwQZjew=*0c7gx|e#%6R@ zw~ReYZgKQ24vK3sa>y{SCx4paCT4e2s|E_H2YZL+roZxpXCN$TG5DxZ4*O!zSRi6s zy` zemaKv&q4a5BwGlAWm9hF(BihNqgUOXF@)(soa<8M1W3ayiSqOt3g;qGDeLbp!?4Yw zKhXg;IpPy$2$=Ng;fH5L^CW-yg)W703aBnLS2b9(B18$PIN8e=n{eG}Wo?hK$X)O6 z>9W2v*`cc0KU9=c!Dx;yPId_183~DtQh#Ff%Gvl{)rIIPPaKr4tx+8Dt#(39%TsmI zO&XmZSQJ;Wq#lDdlsY?c5J9)qxc|Z8c$v>@3{mDZP7-(&> zN#I@>NoKlU`+#qB*3OxyQHeTpf!2hl;coct(;{<9nt>?i8lp2ydc^!2WdTVv{1o-| zmNoq7IMFzVnA#agdiqpmb7Wvgg%R9ciBzIHZtrVX>@QJN@Y!e-aN2@HH5G%DT-%-T zcTb7r+f03#S^vd678!eFmBbcngzTQ2E3`T60Z)KxS*fYuMZ||C#1lcO4#Y-6v`X0` + +@class PSTCKFormTextField; + +@protocol PSTCKFormTextFieldDelegate + +- (void)formTextFieldDidBackspaceOnEmpty:(nonnull PSTCKFormTextField *)formTextField; + +@end + +@interface PSTCKFormTextField : UITextField + +@property(nonatomic, readwrite, nullable) UIColor *defaultColor; +@property(nonatomic, readwrite, nullable) UIColor *errorColor; +@property(nonatomic, readwrite, nullable) UIColor *placeholderColor; + +@property(nonatomic, readwrite, assign)BOOL formatsCardNumbers; +@property(nonatomic, readwrite, assign)BOOL validText; +@property(nonatomic, readwrite, weak, nullable)idformDelegate; + +- (CGSize)measureTextSize; + +@end diff --git a/Paystack/UI/PSTCKFormTextField.m b/Paystack/UI/PSTCKFormTextField.m new file mode 100644 index 0000000..d4f1db9 --- /dev/null +++ b/Paystack/UI/PSTCKFormTextField.m @@ -0,0 +1,145 @@ +// +// PSTCKFormTextField.m +// Paystack +// + +#import "PSTCKFormTextField.h" +#import "PSTCKCardValidator.h" + +#import +#import "TargetConditionals.h" + +#define FAUXPAS_IGNORED_IN_METHOD(...) + +@implementation PSTCKFormTextField + +@synthesize placeholderColor = _placeholderColor; + +- (void)setFormDelegate:(id)formDelegate { + _formDelegate = formDelegate; + self.delegate = formDelegate; +} + +- (void)deleteBackward { + // This deliberately doesn't call super, because the superclass' implementation replaces text without calling delegate methods. + if (self.text.length == 0) { + [self.formDelegate formTextFieldDidBackspaceOnEmpty:self]; + return; + } + NSRange range = NSMakeRange(self.text.length - 1, 1); + if ([self.delegate textField:self shouldChangeCharactersInRange:range replacementString:@""]) { + self.text = [self.text stringByReplacingCharactersInRange:range withString:@""]; + } +} + +- (CGSize)measureTextSize { + return self.attributedText.size; +} + +- (void)setText:(NSString *)text { + NSAttributedString *attributed = [self attributedStringForString:text attributes:[self safeDefaultTextAttributes]]; + [self setAttributedText:attributed]; +} + +- (void)setPlaceholder:(NSString *)placeholder { + NSMutableDictionary *attributes = [[self safeDefaultTextAttributes] mutableCopy]; + if (self.placeholderColor) { + attributes[NSForegroundColorAttributeName] = self.placeholderColor; + } + NSAttributedString *attributed = [self attributedStringForString:placeholder attributes:[attributes copy]]; + [self setAttributedPlaceholder:attributed]; +} + +- (NSAttributedString *)attributedStringForString:(NSString *)string attributes:(NSDictionary *)attributes { + if (!string) { + return nil; + } + NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:string attributes:attributes]; + if (self.formatsCardNumbers && [PSTCKCardValidator stringIsNumeric:string]) { + NSArray *cardSpacing; + PSTCKCardBrand currentBrand = [PSTCKCardValidator brandForNumber:attributedString.string]; + if (currentBrand == PSTCKCardBrandAmex) { + cardSpacing = @[@3, @9]; + } else { + cardSpacing = @[@3, @7, @11]; + } + for (NSUInteger i = 0; i < attributedString.length; i++) { + if ([cardSpacing containsObject:@(i)]) { + [attributedString addAttribute:NSKernAttributeName value:@(5) + range:NSMakeRange(i, 1)]; + } else { + [attributedString addAttribute:NSKernAttributeName value:@(0) + range:NSMakeRange(i, 1)]; + } + } + } + return [attributedString copy]; +} + +- (NSDictionary *)safeDefaultTextAttributes { + FAUXPAS_IGNORED_IN_METHOD(APIAvailability); + if ([self respondsToSelector:@selector(defaultTextAttributes)]) { + return [self defaultTextAttributes]; + } + NSMutableDictionary *attributes = [NSMutableDictionary dictionary]; + if (self.textColor) { + attributes[NSForegroundColorAttributeName] = self.textColor; + } + if (self.font) { + attributes[NSFontAttributeName] = self.font; + } + return [attributes copy]; +} + +- (void)setDefaultColor:(UIColor *)defaultColor { + _defaultColor = defaultColor; + [self updateColor]; +} + +- (void)setErrorColor:(UIColor *)errorColor { + _errorColor = errorColor; + [self updateColor]; +} + +- (void)setValidText:(BOOL)validText { + _validText = validText; + [self updateColor]; +} + +- (void)setPlaceholderColor:(UIColor *)placeholderColor { + _placeholderColor = placeholderColor; + [self setPlaceholder:self.placeholder]; //explicitly rebuild attributed placeholder +} + +- (void)updateColor { + self.textColor = _validText ? self.defaultColor : self.errorColor; +} + +// Workaround for http://www.openradar.appspot.com/19374610 +- (CGRect)editingRectForBounds:(CGRect)bounds { + if (UIDevice.currentDevice.systemVersion.integerValue != 8) { + return [self textRectForBounds:bounds]; + } + + CGFloat const scale = UIScreen.mainScreen.scale; + CGFloat const preferred = self.attributedText.size.height; + CGFloat const delta = (CGFloat)ceil(preferred) - preferred; + CGFloat const adjustment = (CGFloat)floor(delta * scale) / scale; + + CGRect const textRect = [self textRectForBounds:bounds]; + CGRect const editingRect = CGRectOffset(textRect, 0.0, adjustment); + + return editingRect; +} + +// Fixes a weird issue related to our custom override of deleteBackwards. This only affects the simulator and iPads with custom keyboards. +- (NSArray *)keyCommands { + FAUXPAS_IGNORED_IN_METHOD(APIAvailability); + return @[[UIKeyCommand keyCommandWithInput:@"\b" modifierFlags:UIKeyModifierCommand action:@selector(commandDeleteBackwards)]]; +} + +- (void)commandDeleteBackwards { + self.text = @""; +} + +@end diff --git a/Paystack/UI/PSTCKPaymentCardTextField.m b/Paystack/UI/PSTCKPaymentCardTextField.m new file mode 100644 index 0000000..ded6684 --- /dev/null +++ b/Paystack/UI/PSTCKPaymentCardTextField.m @@ -0,0 +1,734 @@ +// +// PSTCKPaymentCardTextField.m +// Paystack +// + +#import + +#import "Paystack.h" +#import "PSTCKPaymentCardTextField.h" +#import "PSTCKPaymentCardTextFieldViewModel.h" +#import "PSTCKFormTextField.h" +#import "PSTCKCardValidator.h" +#import "UIImage+Paystack.h" + +#define FAUXPAS_IGNORED_IN_METHOD(...) + +@interface PSTCKPaymentCardTextField() + +@property(nonatomic, readwrite, strong)PSTCKFormTextField *sizingField; + +@property(nonatomic, readwrite, weak)UIImageView *brandImageView; +@property(nonatomic, readwrite, weak)UIView *fieldsView; + +@property(nonatomic, readwrite, weak)PSTCKFormTextField *numberField; + +@property(nonatomic, readwrite, weak)PSTCKFormTextField *expirationField; + +@property(nonatomic, readwrite, weak)PSTCKFormTextField *cvcField; + +@property(nonatomic, readwrite, strong)PSTCKPaymentCardTextFieldViewModel *viewModel; + +@property(nonatomic, readwrite, weak)UITextField *selectedField; + +@property(nonatomic, assign)BOOL numberFieldShrunk; + +@end + +@implementation PSTCKPaymentCardTextField + +@synthesize font = _font; +@synthesize textColor = _textColor; +@synthesize textErrorColor = _textErrorColor; +@synthesize placeholderColor = _placeholderColor; +@dynamic enabled; + +CGFloat const PSTCKPaymentCardTextFieldDefaultPadding = 10; + +#if CGFLOAT_IS_DOUBLE +#define pstck_roundCGFloat(x) round(x) +#else +#define pstck_roundCGFloat(x) roundf(x) +#endif + +#pragma mark initializers + +- (id)initWithCoder:(NSCoder *)aDecoder { + self = [super initWithCoder:aDecoder]; + if (self) { + [self commonInit]; + } + return self; +} + +- (instancetype)initWithFrame:(CGRect)frame { + self = [super initWithFrame:frame]; + if (self) { + [self commonInit]; + } + return self; +} + +- (void)commonInit { + + self.borderColor = [self.class placeholderGrayColor]; + self.cornerRadius = 5.0f; + self.borderWidth = 1.0f; + + self.clipsToBounds = YES; + + _viewModel = [PSTCKPaymentCardTextFieldViewModel new]; + _sizingField = [self buildTextField]; + + UIImageView *brandImageView = [[UIImageView alloc] initWithImage:self.brandImage]; + brandImageView.contentMode = UIViewContentModeCenter; + brandImageView.backgroundColor = [UIColor clearColor]; + if ([brandImageView respondsToSelector:@selector(setTintColor:)]) { + brandImageView.tintColor = self.placeholderColor; + } + self.brandImageView = brandImageView; + + PSTCKFormTextField *numberField = [self buildTextField]; + numberField.formatsCardNumbers = YES; + numberField.tag = PSTCKCardFieldTypeNumber; + self.numberField = numberField; + self.numberPlaceholder = [self.viewModel defaultPlaceholder]; + + PSTCKFormTextField *expirationField = [self buildTextField]; + expirationField.tag = PSTCKCardFieldTypeExpiration; + expirationField.alpha = 0; + self.expirationField = expirationField; + self.expirationPlaceholder = @"MM/YY"; + + PSTCKFormTextField *cvcField = [self buildTextField]; + cvcField.tag = PSTCKCardFieldTypeCVC; + cvcField.alpha = 0; + self.cvcField = cvcField; + self.cvcPlaceholder = @"CVC"; + + UIView *fieldsView = [[UIView alloc] init]; + fieldsView.clipsToBounds = YES; + fieldsView.backgroundColor = [UIColor clearColor]; + self.fieldsView = fieldsView; + + [self addSubview:self.fieldsView]; + [self.fieldsView addSubview:cvcField]; + [self.fieldsView addSubview:expirationField]; + [self.fieldsView addSubview:numberField]; + [self addSubview:brandImageView]; +} + +- (PSTCKPaymentCardTextFieldViewModel *)viewModel { + if (_viewModel == nil) { + _viewModel = [PSTCKPaymentCardTextFieldViewModel new]; + } + return _viewModel; +} + +#pragma mark appearance properties + ++ (UIColor *)placeholderGrayColor { + return [UIColor lightGrayColor]; +} + +- (void)setBackgroundColor:(UIColor *)backgroundColor { + [super setBackgroundColor:[backgroundColor copy]]; + self.numberField.backgroundColor = self.backgroundColor; +} + +- (UIColor *)backgroundColor { + return [super backgroundColor] ?: [UIColor whiteColor]; +} + +- (void)setFont:(UIFont *)font { + _font = [font copy]; + + for (UITextField *field in [self allFields]) { + field.font = _font; + } + + self.sizingField.font = _font; + + [self setNeedsLayout]; +} + +- (UIFont *)font { + return _font ?: [UIFont systemFontOfSize:18]; +} + +- (void)setTextColor:(UIColor *)textColor { + _textColor = [textColor copy]; + + for (PSTCKFormTextField *field in [self allFields]) { + field.defaultColor = _textColor; + } +} + +- (void)setContentVerticalAlignment:(UIControlContentVerticalAlignment)contentVerticalAlignment { + [super setContentVerticalAlignment:contentVerticalAlignment]; + for (UITextField *field in [self allFields]) { + field.contentVerticalAlignment = contentVerticalAlignment; + } + switch (contentVerticalAlignment) { + case UIControlContentVerticalAlignmentCenter: + self.brandImageView.contentMode = UIViewContentModeCenter; + break; + case UIControlContentVerticalAlignmentBottom: + self.brandImageView.contentMode = UIViewContentModeBottom; + break; + case UIControlContentVerticalAlignmentFill: + self.brandImageView.contentMode = UIViewContentModeTop; + break; + case UIControlContentVerticalAlignmentTop: + self.brandImageView.contentMode = UIViewContentModeTop; + break; + } +} + +- (UIColor *)textColor { + return _textColor ?: [UIColor blackColor]; +} + +- (void)setTextErrorColor:(UIColor *)textErrorColor { + _textErrorColor = [textErrorColor copy]; + + for (PSTCKFormTextField *field in [self allFields]) { + field.errorColor = _textErrorColor; + } +} + +- (UIColor *)textErrorColor { + return _textErrorColor ?: [UIColor redColor]; +} + +- (void)setPlaceholderColor:(UIColor *)placeholderColor { + _placeholderColor = [placeholderColor copy]; + + if ([self.brandImageView respondsToSelector:@selector(setTintColor:)]) { + self.brandImageView.tintColor = placeholderColor; + } + + for (PSTCKFormTextField *field in [self allFields]) { + field.placeholderColor = _placeholderColor; + } +} + +- (UIColor *)placeholderColor { + return _placeholderColor ?: [self.class placeholderGrayColor]; +} + +- (void)setNumberPlaceholder:(NSString * __nullable)numberPlaceholder { + _numberPlaceholder = [numberPlaceholder copy]; + self.numberField.placeholder = _numberPlaceholder; +} + +- (void)setExpirationPlaceholder:(NSString * __nullable)expirationPlaceholder { + _expirationPlaceholder = [expirationPlaceholder copy]; + self.expirationField.placeholder = _expirationPlaceholder; +} + +- (void)setCvcPlaceholder:(NSString * __nullable)cvcPlaceholder { + _cvcPlaceholder = [cvcPlaceholder copy]; + self.cvcField.placeholder = _cvcPlaceholder; +} + +- (void)setCursorColor:(UIColor *)cursorColor { + self.tintColor = cursorColor; +} + +- (UIColor *)cursorColor { + return self.tintColor; +} + +- (void)setBorderColor:(UIColor * __nullable)borderColor { + self.layer.borderColor = [[borderColor copy] CGColor]; +} + +- (UIColor * __nullable)borderColor { + return [[UIColor alloc] initWithCGColor:self.layer.borderColor]; +} + +- (void)setCornerRadius:(CGFloat)cornerRadius { + self.layer.cornerRadius = cornerRadius; +} + +- (CGFloat)cornerRadius { + return self.layer.cornerRadius; +} + +- (void)setBorderWidth:(CGFloat)borderWidth { + self.layer.borderWidth = borderWidth; +} + +- (CGFloat)borderWidth { + return self.layer.borderWidth; +} + +- (void)setKeyboardAppearance:(UIKeyboardAppearance)keyboardAppearance { + _keyboardAppearance = keyboardAppearance; + for (PSTCKFormTextField *field in [self allFields]) { + field.keyboardAppearance = keyboardAppearance; + } +} + +- (void)setInputAccessoryView:(UIView *)inputAccessoryView { + _inputAccessoryView = inputAccessoryView; + + for (PSTCKFormTextField *field in [self allFields]) { + field.inputAccessoryView = inputAccessoryView; + } +} + +#pragma mark UIControl + +- (void)setEnabled:(BOOL)enabled { + [super setEnabled:enabled]; + for (PSTCKFormTextField *textField in [self allFields]) { + textField.enabled = enabled; + }; +} + +#pragma mark UIResponder & related methods + +- (BOOL)isFirstResponder { + return [self.selectedField isFirstResponder]; +} + +- (BOOL)canBecomeFirstResponder { + return [[self firstResponderField] canBecomeFirstResponder]; +} + +- (BOOL)becomeFirstResponder { + return [[self firstResponderField] becomeFirstResponder]; +} + +- (PSTCKFormTextField *)firstResponderField { + + if ([self.viewModel validationStateForField:PSTCKCardFieldTypeNumber] != PSTCKCardValidationStateValid) { + return self.numberField; + } else if ([self.viewModel validationStateForField:PSTCKCardFieldTypeExpiration] != PSTCKCardValidationStateValid) { + return self.expirationField; + } else { + return self.cvcField; + } +} + +- (BOOL)canResignFirstResponder { + return [self.selectedField canResignFirstResponder]; +} + +- (BOOL)resignFirstResponder { + [super resignFirstResponder]; + BOOL success = [self.selectedField resignFirstResponder]; + [self setNumberFieldShrunk:[self shouldShrinkNumberField] animated:YES completion:nil]; + return success; +} + +- (BOOL)selectNextField { + return [[self nextField] becomeFirstResponder]; +} + +- (BOOL)selectPreviousField { + return [[self previousField] becomeFirstResponder]; +} + +- (PSTCKFormTextField *)nextField { + if (self.selectedField == self.numberField) { + if ([self.viewModel validationStateForField:self.expirationField.tag] == PSTCKCardValidationStateValid) { + return self.cvcField; + } + return self.expirationField; + } else if (self.selectedField == self.expirationField) { + return self.cvcField; + } + return nil; +} + +- (PSTCKFormTextField *)previousField { + if (self.selectedField == self.cvcField) { + return self.expirationField; + } else if (self.selectedField == self.expirationField) { + return self.numberField; + } + return nil; +} + +#pragma mark public convenience methods + +- (void)clear { + for (PSTCKFormTextField *field in [self allFields]) { + field.text = @""; + } + self.viewModel = [PSTCKPaymentCardTextFieldViewModel new]; + [self onChange]; + [self updateImageForFieldType:PSTCKCardFieldTypeNumber]; + __weak id weakself = self; + [self setNumberFieldShrunk:NO animated:YES completion:^(__unused BOOL completed){ + __strong id strongself = weakself; + if ([strongself isFirstResponder]) { + [[strongself numberField] becomeFirstResponder]; + } + }]; +} + +- (BOOL)isValid { + return [self.viewModel isValid]; +} + +#pragma mark readonly variables + +- (NSString *)cardNumber { + return self.viewModel.cardNumber; +} + +- (NSUInteger)expirationMonth { + return [self.viewModel.expirationMonth integerValue]; +} + +- (NSUInteger)expirationYear { + return [self.viewModel.expirationYear integerValue]; +} + +- (NSString *)cvc { + return self.viewModel.cvc; +} + +- (PSTCKCardParams *)cardParams { + PSTCKCardParams *c = [[PSTCKCardParams alloc] init]; + c.number = self.cardNumber; + c.expMonth = self.expirationMonth; + c.expYear = self.expirationYear; + c.cvc = self.cvc; + return c; +} + +- (void)setCardParams:(PSTCKCardParams *)cardParams { + [self setText:cardParams.number inField:PSTCKCardFieldTypeNumber]; + BOOL expirationPresent = cardParams.expMonth && cardParams.expYear; + if (expirationPresent) { + NSString *text = [NSString stringWithFormat:@"%02lu%02lu", + (unsigned long)cardParams.expMonth, + (unsigned long)cardParams.expYear%100]; + [self setText:text inField:PSTCKCardFieldTypeExpiration]; + } + else { + [self setText:@"" inField:PSTCKCardFieldTypeExpiration]; + } + [self setText:cardParams.cvc inField:PSTCKCardFieldTypeCVC]; + + BOOL shrinkNumberField = [self shouldShrinkNumberField]; + [self setNumberFieldShrunk:shrinkNumberField animated:NO completion:nil]; + + // update the card image, falling back to the number field image if not editing + if ([self.expirationField isFirstResponder]) { + [self updateImageForFieldType:PSTCKCardFieldTypeExpiration]; + } + else if ([self.cvcField isFirstResponder]) { + [self updateImageForFieldType:PSTCKCardFieldTypeCVC]; + } + else { + [self updateImageForFieldType:PSTCKCardFieldTypeNumber]; + } +} + +- (PSTCKCardParams *)card { + if (!self.isValid) { return nil; } + return self.cardParams; +} + +- (void)setCard:(PSTCKCardParams *)card { + [self setCardParams:card]; +} + +- (void)setText:(NSString *)text inField:(PSTCKCardFieldType)field { + NSString *nonNilText = text == nil ? @"" : text; + PSTCKFormTextField *textField = nil; + switch (field) { + case PSTCKCardFieldTypeNumber: + textField = self.numberField; + break; + case PSTCKCardFieldTypeExpiration: + textField = self.expirationField; + break; + case PSTCKCardFieldTypeCVC: + textField = self.cvcField; + break; + } + self.selectedField = (self.isFirstResponder) ? textField : nil; + id delegate = (id)self; + NSRange range = NSMakeRange(0, textField.text.length); + [delegate textField:textField shouldChangeCharactersInRange:range + replacementString:nonNilText]; +} + +- (CGSize)intrinsicContentSize { + + CGSize imageSize = self.brandImage.size; + + self.sizingField.text = self.viewModel.defaultPlaceholder; + CGFloat textHeight = [self.sizingField measureTextSize].height; + CGFloat imageHeight = imageSize.height + (PSTCKPaymentCardTextFieldDefaultPadding * 2); + CGFloat height = pstck_roundCGFloat((MAX(MAX(imageHeight, textHeight), 44))); + + CGFloat width = pstck_roundCGFloat([self widthForCardNumber:self.viewModel.defaultPlaceholder] + imageSize.width + (PSTCKPaymentCardTextFieldDefaultPadding * 3)); + + return CGSizeMake(width, height); +} + +- (CGRect)brandImageRectForBounds:(CGRect)bounds { + return CGRectMake(PSTCKPaymentCardTextFieldDefaultPadding, 2, self.brandImageView.image.size.width, bounds.size.height - 2); +} + +- (CGRect)fieldsRectForBounds:(CGRect)bounds { + CGRect brandImageRect = [self brandImageRectForBounds:bounds]; + return CGRectMake(CGRectGetMaxX(brandImageRect), 0, CGRectGetWidth(bounds) - CGRectGetMaxX(brandImageRect), CGRectGetHeight(bounds)); +} + +- (CGRect)numberFieldRectForBounds:(CGRect)bounds { + CGFloat placeholderWidth = [self widthForCardNumber:self.numberField.placeholder] - 4; + CGFloat numberWidth = [self widthForCardNumber:self.viewModel.defaultPlaceholder] - 4; + CGFloat numberFieldWidth = MAX(placeholderWidth, numberWidth); + CGFloat nonFragmentWidth = [self widthForCardNumber:[self.viewModel numberWithoutLastDigits]] - 13; + CGFloat numberFieldX = self.numberFieldShrunk ? PSTCKPaymentCardTextFieldDefaultPadding - nonFragmentWidth : 8; + return CGRectMake(numberFieldX, 0, numberFieldWidth, CGRectGetHeight(bounds)); +} + +- (CGRect)cvcFieldRectForBounds:(CGRect)bounds { + CGRect fieldsRect = [self fieldsRectForBounds:bounds]; + + CGFloat cvcWidth = MAX([self widthForText:self.cvcField.placeholder], [self widthForText:@"8888"]); + CGFloat cvcX = self.numberFieldShrunk ? + CGRectGetWidth(fieldsRect) - cvcWidth - PSTCKPaymentCardTextFieldDefaultPadding / 2 : + CGRectGetWidth(fieldsRect); + return CGRectMake(cvcX, 0, cvcWidth, CGRectGetHeight(bounds)); +} + +- (CGRect)expirationFieldRectForBounds:(CGRect)bounds { + CGRect numberFieldRect = [self numberFieldRectForBounds:bounds]; + CGRect cvcRect = [self cvcFieldRectForBounds:bounds]; + + CGFloat expirationWidth = MAX([self widthForText:self.expirationField.placeholder], [self widthForText:@"88/88"]); + CGFloat expirationX = (CGRectGetMaxX(numberFieldRect) + CGRectGetMinX(cvcRect) - expirationWidth) / 2; + return CGRectMake(expirationX, 0, expirationWidth, CGRectGetHeight(bounds)); +} + +- (void)layoutSubviews { + [super layoutSubviews]; + + CGRect bounds = self.bounds; + + self.brandImageView.frame = [self brandImageRectForBounds:bounds]; + self.fieldsView.frame = [self fieldsRectForBounds:bounds]; + self.numberField.frame = [self numberFieldRectForBounds:bounds]; + self.cvcField.frame = [self cvcFieldRectForBounds:bounds]; + self.expirationField.frame = [self expirationFieldRectForBounds:bounds]; + +} + +#pragma mark - private helper methods + +- (PSTCKFormTextField *)buildTextField { + PSTCKFormTextField *textField = [[PSTCKFormTextField alloc] initWithFrame:CGRectZero]; + textField.backgroundColor = [UIColor clearColor]; + textField.keyboardType = UIKeyboardTypeNumberPad; + textField.font = self.font; + textField.defaultColor = self.textColor; + textField.errorColor = self.textErrorColor; + textField.placeholderColor = self.placeholderColor; + textField.formDelegate = self; + return textField; +} + +- (NSArray *)allFields { + return @[self.numberField, self.expirationField, self.cvcField]; +} + +typedef void (^PSTCKNumberShrunkCompletionBlock)(BOOL completed); +- (void)setNumberFieldShrunk:(BOOL)shrunk animated:(BOOL)animated + completion:(PSTCKNumberShrunkCompletionBlock)completion { + + if (_numberFieldShrunk == shrunk) { + if (completion) { + completion(YES); + } + return; + } + + _numberFieldShrunk = shrunk; + void (^animations)() = ^void() { + for (UIView *view in @[self.expirationField, self.cvcField]) { + view.alpha = 1.0f * shrunk; + } + [self layoutSubviews]; + }; + + FAUXPAS_IGNORED_IN_METHOD(APIAvailability); + NSTimeInterval duration = animated * 0.3; + if ([UIView respondsToSelector:@selector(animateWithDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:)]) { + [UIView animateWithDuration:duration + delay:0 + usingSpringWithDamping:0.85f + initialSpringVelocity:0 + options:0 + animations:animations + completion:completion]; + } else { + [UIView animateWithDuration:duration + animations:animations + completion:completion]; + } +} + +- (BOOL)shouldShrinkNumberField { + return [self.viewModel validationStateForField:PSTCKCardFieldTypeNumber] == PSTCKCardValidationStateValid; +} + +- (CGFloat)widthForText:(NSString *)text { + self.sizingField.formatsCardNumbers = NO; + [self.sizingField setText:text]; + return [self.sizingField measureTextSize].width + 8; +} + +- (CGFloat)widthForTextWithLength:(NSUInteger)length { + NSString *text = [@"" stringByPaddingToLength:length withString:@"M" startingAtIndex:0]; + return [self widthForText:text]; +} + +- (CGFloat)widthForCardNumber:(NSString *)cardNumber { + self.sizingField.formatsCardNumbers = YES; + [self.sizingField setText:cardNumber]; + return [self.sizingField measureTextSize].width + 20; +} + +#pragma mark PSTCKPaymentTextFieldDelegate + +- (void)formTextFieldDidBackspaceOnEmpty:(__unused PSTCKFormTextField *)formTextField { + PSTCKFormTextField *previous = [self previousField]; + [previous becomeFirstResponder]; + [previous deleteBackward]; +} + +- (void)textFieldDidBeginEditing:(UITextField *)textField { + self.selectedField = (PSTCKFormTextField *)textField; + switch ((PSTCKCardFieldType)textField.tag) { + case PSTCKCardFieldTypeNumber: + [self setNumberFieldShrunk:NO animated:YES completion:nil]; + if ([self.delegate respondsToSelector:@selector(paymentCardTextFieldDidBeginEditingNumber:)]) { + [self.delegate paymentCardTextFieldDidBeginEditingNumber:self]; + } + break; + case PSTCKCardFieldTypeCVC: + [self setNumberFieldShrunk:YES animated:YES completion:nil]; + if ([self.delegate respondsToSelector:@selector(paymentCardTextFieldDidBeginEditingCVC:)]) { + [self.delegate paymentCardTextFieldDidBeginEditingCVC:self]; + } + break; + case PSTCKCardFieldTypeExpiration: + [self setNumberFieldShrunk:YES animated:YES completion:nil]; + if ([self.delegate respondsToSelector:@selector(paymentCardTextFieldDidBeginEditingExpiration:)]) { + [self.delegate paymentCardTextFieldDidBeginEditingExpiration:self]; + } + break; + } + [self updateImageForFieldType:textField.tag]; +} + +- (void)textFieldDidEndEditing:(__unused UITextField *)textField { + self.selectedField = nil; +} + +- (BOOL)textField:(PSTCKFormTextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { + + BOOL deletingLastCharacter = (range.location == textField.text.length - 1 && range.length == 1 && [string isEqualToString:@""]); + if (deletingLastCharacter && [textField.text hasSuffix:@"/"] && range.location > 0) { + range.location -= 1; + range.length += 1; + } + + NSString *newText = [textField.text stringByReplacingCharactersInRange:range withString:string]; + PSTCKCardFieldType fieldType = textField.tag; + switch (fieldType) { + case PSTCKCardFieldTypeNumber: + self.viewModel.cardNumber = newText; + textField.text = self.viewModel.cardNumber; + break; + case PSTCKCardFieldTypeExpiration: { + self.viewModel.rawExpiration = newText; + textField.text = self.viewModel.rawExpiration; + break; + } + case PSTCKCardFieldTypeCVC: + self.viewModel.cvc = newText; + textField.text = self.viewModel.cvc; + break; + } + + [self updateImageForFieldType:fieldType]; + + PSTCKCardValidationState state = [self.viewModel validationStateForField:fieldType]; + textField.validText = YES; + switch (state) { + case PSTCKCardValidationStateInvalid: + textField.validText = NO; + break; + case PSTCKCardValidationStateIncomplete: + break; + case PSTCKCardValidationStateValid: { + [self selectNextField]; + break; + } + } + [self onChange]; + + return NO; +} + +- (UIImage *)brandImage { + if (self.selectedField) { + return [self brandImageForFieldType:self.selectedField.tag]; + } else { + return [self brandImageForFieldType:PSTCKCardFieldTypeNumber]; + } +} + ++ (UIImage *)cvcImageForCardBrand:(PSTCKCardBrand)cardBrand { + return [UIImage pstck_cvcImageForCardBrand:cardBrand]; +} + ++ (UIImage *)brandImageForCardBrand:(PSTCKCardBrand)cardBrand { + return [UIImage pstck_brandImageForCardBrand:cardBrand]; +} + +- (UIImage *)brandImageForFieldType:(PSTCKCardFieldType)fieldType { + if (fieldType == PSTCKCardFieldTypeCVC) { + return [self.class cvcImageForCardBrand:self.viewModel.brand]; + } + + return [self.class brandImageForCardBrand:self.viewModel.brand]; +} + +- (void)updateImageForFieldType:(PSTCKCardFieldType)fieldType { + UIImage *image = [self brandImageForFieldType:fieldType]; + if (image != self.brandImageView.image) { + self.brandImageView.image = image; + + CATransition *transition = [CATransition animation]; + transition.duration = 0.2f; + transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]; + transition.type = kCATransitionFade; + + [self.brandImageView.layer addAnimation:transition forKey:nil]; + + [self setNeedsLayout]; + } +} + +- (void)onChange { + if ([self.delegate respondsToSelector:@selector(paymentCardTextFieldDidChange:)]) { + [self.delegate paymentCardTextFieldDidChange:self]; + } + [self sendActionsForControlEvents:UIControlEventValueChanged]; +} + +@end + diff --git a/Paystack/UI/PSTCKPaymentCardTextFieldViewModel.h b/Paystack/UI/PSTCKPaymentCardTextFieldViewModel.h new file mode 100644 index 0000000..0671813 --- /dev/null +++ b/Paystack/UI/PSTCKPaymentCardTextFieldViewModel.h @@ -0,0 +1,34 @@ +// +// PSTCKPaymentCardTextFieldViewModel.h +// Paystack +// + +#import +#import + +#import "PSTCKCard.h" +#import "PSTCKCardValidator.h" + +typedef NS_ENUM(NSInteger, PSTCKCardFieldType) { + PSTCKCardFieldTypeNumber, + PSTCKCardFieldTypeExpiration, + PSTCKCardFieldTypeCVC, +}; + +@interface PSTCKPaymentCardTextFieldViewModel : NSObject + +@property(nonatomic, readwrite, copy, nullable)NSString *cardNumber; +@property(nonatomic, readwrite, copy, nullable)NSString *rawExpiration; +@property(nonatomic, readonly, nullable)NSString *expirationMonth; +@property(nonatomic, readonly, nullable)NSString *expirationYear; +@property(nonatomic, readwrite, copy, nullable)NSString *cvc; +@property(nonatomic, readonly) PSTCKCardBrand brand; + +- (nonnull NSString *)defaultPlaceholder; +- (nullable NSString *)numberWithoutLastDigits; + +- (BOOL)isValid; + +- (PSTCKCardValidationState)validationStateForField:(PSTCKCardFieldType)fieldType; + +@end diff --git a/Paystack/UI/PSTCKPaymentCardTextFieldViewModel.m b/Paystack/UI/PSTCKPaymentCardTextFieldViewModel.m new file mode 100644 index 0000000..65ded0a --- /dev/null +++ b/Paystack/UI/PSTCKPaymentCardTextFieldViewModel.m @@ -0,0 +1,119 @@ +// +// PSTCKPaymentCardTextFieldViewModel.m +// Paystack +// + +#import "PSTCKPaymentCardTextFieldViewModel.h" +#import "PSTCKCardValidator.h" + +#define FAUXPAS_IGNORED_IN_METHOD(...) + +@interface NSString(PaystackSubstring) +- (NSString *)pstck_safeSubstringToIndex:(NSUInteger)index; +- (NSString *)pstck_safeSubstringFromIndex:(NSUInteger)index; +@end + +@implementation NSString(PaystackSubstring) + +- (NSString *)pstck_safeSubstringToIndex:(NSUInteger)index { + return [self substringToIndex:MIN(self.length, index)]; +} + +- (NSString *)pstck_safeSubstringFromIndex:(NSUInteger)index { + return (index > self.length) ? @"" : [self substringFromIndex:index]; +} + +@end + +@implementation PSTCKPaymentCardTextFieldViewModel + +- (void)setCardNumber:(NSString *)cardNumber { + NSString *sanitizedNumber = [PSTCKCardValidator sanitizedNumericStringForString:cardNumber]; + PSTCKCardBrand brand = [PSTCKCardValidator brandForNumber:sanitizedNumber]; + NSInteger maxLength = [PSTCKCardValidator lengthForCardBrand:brand]; + _cardNumber = [sanitizedNumber pstck_safeSubstringToIndex:maxLength]; +} + +// This might contain slashes. +- (void)setRawExpiration:(NSString *)expiration { + NSString *sanitizedExpiration = [PSTCKCardValidator sanitizedNumericStringForString:expiration]; + self.expirationMonth = [sanitizedExpiration pstck_safeSubstringToIndex:2]; + self.expirationYear = [[sanitizedExpiration pstck_safeSubstringFromIndex:2] pstck_safeSubstringToIndex:2]; +} + +- (NSString *)rawExpiration { + NSMutableArray *array = [@[] mutableCopy]; + if (self.expirationMonth && ![self.expirationMonth isEqualToString:@""]) { + [array addObject:self.expirationMonth]; + } + + if ([PSTCKCardValidator validationStateForExpirationMonth:self.expirationMonth] == PSTCKCardValidationStateValid) { + [array addObject:self.expirationYear]; + } + return [array componentsJoinedByString:@"/"]; +} + +- (void)setExpirationMonth:(NSString *)expirationMonth { + NSString *sanitizedExpiration = [PSTCKCardValidator sanitizedNumericStringForString:expirationMonth]; + if (sanitizedExpiration.length == 1 && ![sanitizedExpiration isEqualToString:@"0"] && ![sanitizedExpiration isEqualToString:@"1"]) { + sanitizedExpiration = [@"0" stringByAppendingString:sanitizedExpiration]; + } + _expirationMonth = [sanitizedExpiration pstck_safeSubstringToIndex:2]; +} + +- (void)setExpirationYear:(NSString *)expirationYear { + _expirationYear = [[PSTCKCardValidator sanitizedNumericStringForString:expirationYear] pstck_safeSubstringToIndex:2]; +} + +- (void)setCvc:(NSString *)cvc { + NSInteger maxLength = [PSTCKCardValidator maxCVCLengthForCardBrand:self.brand]; + _cvc = [[PSTCKCardValidator sanitizedNumericStringForString:cvc] pstck_safeSubstringToIndex:maxLength]; +} + +- (PSTCKCardBrand)brand { + return [PSTCKCardValidator brandForNumber:self.cardNumber]; +} + +- (PSTCKCardValidationState)validationStateForField:(PSTCKCardFieldType)fieldType { + switch (fieldType) { + case PSTCKCardFieldTypeNumber: + return [PSTCKCardValidator validationStateForNumber:self.cardNumber validatingCardBrand:YES]; + break; + case PSTCKCardFieldTypeExpiration: { + PSTCKCardValidationState monthState = [PSTCKCardValidator validationStateForExpirationMonth:self.expirationMonth]; + PSTCKCardValidationState yearState = [PSTCKCardValidator validationStateForExpirationYear:self.expirationYear inMonth:self.expirationMonth]; + if (monthState == PSTCKCardValidationStateValid && yearState == PSTCKCardValidationStateValid) { + return PSTCKCardValidationStateValid; + } else if (monthState == PSTCKCardValidationStateInvalid || yearState == PSTCKCardValidationStateInvalid) { + return PSTCKCardValidationStateInvalid; + } else { + return PSTCKCardValidationStateIncomplete; + } + break; + } + case PSTCKCardFieldTypeCVC: + return [PSTCKCardValidator validationStateForCVC:self.cvc cardBrand:self.brand]; + } +} + +- (BOOL)isValid { + return ([self validationStateForField:PSTCKCardFieldTypeNumber] == PSTCKCardValidationStateValid && + [self validationStateForField:PSTCKCardFieldTypeExpiration] == PSTCKCardValidationStateValid && + [self validationStateForField:PSTCKCardFieldTypeCVC] == PSTCKCardValidationStateValid); +} + +- (NSString *)defaultPlaceholder { + return @"1234567812345678"; +} + +- (NSString *)numberWithoutLastDigits { + NSUInteger length = [PSTCKCardValidator fragmentLengthForCardBrand:[PSTCKCardValidator brandForNumber:self.cardNumber]]; + NSUInteger toIndex = self.cardNumber.length - length; + + return (toIndex < self.cardNumber.length) ? + [self.cardNumber substringToIndex:toIndex] : + [self.defaultPlaceholder pstck_safeSubstringToIndex:[self defaultPlaceholder].length - length]; + +} + +@end diff --git a/Paystack/UI/UIImage+Paystack.m b/Paystack/UI/UIImage+Paystack.m new file mode 100644 index 0000000..8268b25 --- /dev/null +++ b/Paystack/UI/UIImage+Paystack.m @@ -0,0 +1,93 @@ +// +// UIImage+Paystack.m +// Paystack +// + +#import "UIImage+Paystack.h" + +#define FAUXPAS_IGNORED_IN_METHOD(...) + +// Dummy class for locating the framework bundle +@interface PSTCKBundleLocator : NSObject +@end +@implementation PSTCKBundleLocator +@end + +@implementation UIImage (Paystack) + ++ (UIImage *)pstck_amexCardImage { + return [UIImage pstck_brandImageForCardBrand:PSTCKCardBrandAmex]; +} + ++ (UIImage *)pstck_dinersClubCardImage { + return [UIImage pstck_brandImageForCardBrand:PSTCKCardBrandDinersClub]; +} + ++ (UIImage *)pstck_discoverCardImage { + return [UIImage pstck_brandImageForCardBrand:PSTCKCardBrandDiscover]; +} + ++ (UIImage *)pstck_jcbCardImage { + return [UIImage pstck_brandImageForCardBrand:PSTCKCardBrandJCB]; +} + ++ (UIImage *)pstck_masterCardCardImage { + return [UIImage pstck_brandImageForCardBrand:PSTCKCardBrandMasterCard]; +} + ++ (UIImage *)pstck_visaCardImage { + return [UIImage pstck_brandImageForCardBrand:PSTCKCardBrandVisa]; +} + ++ (UIImage *)pstck_unknownCardCardImage { + return [UIImage pstck_brandImageForCardBrand:PSTCKCardBrandUnknown]; +} + ++ (UIImage *)pstck_brandImageForCardBrand:(PSTCKCardBrand)brand { + FAUXPAS_IGNORED_IN_METHOD(APIAvailability); + NSString *imageName; + BOOL templateSupported = [[UIImage new] respondsToSelector:@selector(imageWithRenderingMode:)]; + switch (brand) { + case PSTCKCardBrandAmex: + imageName = @"pstck_card_amex"; + break; + case PSTCKCardBrandDinersClub: + imageName = @"pstck_card_diners"; + break; + case PSTCKCardBrandDiscover: + imageName = @"pstck_card_discover"; + break; + case PSTCKCardBrandJCB: + imageName = @"pstck_card_jcb"; + break; + case PSTCKCardBrandMasterCard: + imageName = @"pstck_card_mastercard"; + break; + case PSTCKCardBrandUnknown: + imageName = templateSupported ? @"pstck_card_placeholder_template" : @"pstck_card_placeholder"; + break; + case PSTCKCardBrandVisa: + imageName = @"pstck_card_visa"; + } + UIImage *image = [UIImage pstck_safeImageNamed:imageName]; + if (brand == PSTCKCardBrandUnknown && templateSupported) { + image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; + } + return image; +} + ++ (UIImage *)pstck_cvcImageForCardBrand:(PSTCKCardBrand)brand { + NSString *imageName = brand == PSTCKCardBrandAmex ? @"pstck_card_cvc_amex" : @"pstck_card_cvc"; + return [UIImage pstck_safeImageNamed:imageName]; +} + ++ (UIImage *)pstck_safeImageNamed:(NSString *)imageName { + if ([[UIImage class] respondsToSelector:@selector(imageNamed:inBundle:compatibleWithTraitCollection:)]) { + return [UIImage imageNamed:imageName inBundle:[NSBundle bundleForClass:[PSTCKBundleLocator class]] compatibleWithTraitCollection:nil]; + } + return [UIImage imageNamed:imageName]; +} + +@end + +void linkUIImageCategory(void){} diff --git a/Paystack/module.modulemap b/Paystack/module.modulemap new file mode 100644 index 0000000..9b84f78 --- /dev/null +++ b/Paystack/module.modulemap @@ -0,0 +1,5 @@ +framework module Paystack { + umbrella header "Paystack.h" + export * + module * { export * } +} \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..e4617a9 --- /dev/null +++ b/README.md @@ -0,0 +1,65 @@ +# Paystack iOS SDK + +[![CocoaPods](https://img.shields.io/cocoapods/v/Paystack.svg?style=flat)](http://cocoapods.org/?q=author%3Apaystack%20name%3Apaystack) +[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) +[![CocoaPods](https://img.shields.io/cocoapods/l/Paystack.svg?style=flat)](https://github.com/paystackhq/paystack-ios/blob/master/LICENSE) +[![CocoaPods](https://img.shields.io/cocoapods/p/Paystack.svg?style=flat)](https://github.com/paystackhq/paystack-ios#) + +The Paystack iOS SDK make it easy to collect your users' credit card details inside your iOS app. By creating tokens, Paystack handles the bulk of PCI compliance by preventing sensitive card data from hitting your server. + +## Requirements +Our SDK is compatible with iOS apps supporting iOS 7.0 and above. It requires Xcode 7.0+ to build the source. + +## Integration + +We've written a [guide](GUIDE.md) that explains everything from installation, to creating payment tokens and more. + +## Example app + +There is an example app included in the repository: +- Paystack iOS Example shows a minimal Swift integration with our iOS SDK using PSTCKPaymentCardTextField, a native credit card UI form component we provide. It uses a small example backend to make charges. + +To build and run the example apps, open `Paystack.xcworkspace` and choose the appropriate scheme. + +### Getting started with the Simple iOS Example App + +Note: The example app requires Xcode 7.0 to build and run. + +Before you can run the app, you need to provide it with your Paystack publishable key. + +1. If you haven't already, sign up for a [Paystack account](https://dashboard.paystack.com/#/signup) (it takes seconds). Then go to https://dashboard.paystack.co/#/settings/developer. +2. Replace the `paystackPublishableKey` constant in ViewController.swift (for the Sample app) with your Test Publishable Key. +3. Head to https://github.com/paystackhq/sample-charge-token-backend and click "Deploy to Heroku" (you may have to sign up for a Heroku account as part of this process). Provide your Paystack test secret key for the `PAYSTACK_TEST_SECRET_KEY` field under 'Env'. Click "Deploy for Free". +4. Replace the `backendChargeURLString` variable in the example iOS app with the app URL Heroku provides you with (e.g. "https://my-example-app.herokuapp.com") + +After this is done, you can make test payments through the app (use credit card number 4123 4501 3100 1381, along with 883 as cvc and any future expiration date) and then view the payments in your Paystack Dashboard! + +And the return value from the backend will be displayed in your Output window. + +## Running the tests + +1. Open Paystack.xcworkspace +1. Choose the "iOS Tests" or "OS X Tests" scheme +1. Run Product -> Test +## Misc. notes + +### Handling errors + +See [PaystackError.h](https://github.com/paystackhq/paystack-ios/blob/master/Paystack/PublicHeaders/PaystackError.h) for a list of error codes that may be returned from the Paystack API. + +### Validating PSTCKCards + +You have a few options for handling validation of credit card data on the client, depending on what your application does. Client-side validation of credit card data is not required since our API will correctly reject invalid card information, but can be useful to validate information as soon as a user enters it, or simply to save a network request. + +The simplest thing you can do is to populate an `PSTCKCard` object and, before sending the request, call `- (BOOL)validateCardReturningError:` on the card. This validates the entire card object, but is not useful for validating card properties one at a time. + +To validate `PSTCKCard` properties individually, you should use the following: + + - (BOOL)validateNumber:error: + - (BOOL)validateCvc:error: + - (BOOL)validateExpMonth:error: + - (BOOL)validateExpYear:error: + +These methods follow the validation method convention used by [key-value validation](http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/KeyValueCoding/Articles/Validation.html). So, you can use these methods by invoking them directly, or by calling `[card validateValue:forKey:error]` for a property on the `PSTCKCard` object. + +When using these validation methods, you will want to set the property on your card object when a property does validate before validating the next property. This allows the methods to use existing properties on the card correctly to validate a new property. For example, validating `5` for the `expMonth` property will return YES if no `expYear` is set. But if `expYear` is set and you try to set `expMonth` to 5 and the combination of `expMonth` and `expYear` is in the past, `5` will not validate. The order in which you call the validate methods does not matter for this though. diff --git a/Tests/OSX Tests/Info.plist b/Tests/OSX Tests/Info.plist new file mode 100644 index 0000000..90a0941 --- /dev/null +++ b/Tests/OSX Tests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.paystack.Paystack-OSX-Tests + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Tests/Tests/Info.plist b/Tests/Tests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/Tests/Tests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Tests/Tests/PSTCKAPIClientTest.m b/Tests/Tests/PSTCKAPIClientTest.m new file mode 100644 index 0000000..02bfe60 --- /dev/null +++ b/Tests/Tests/PSTCKAPIClientTest.m @@ -0,0 +1,25 @@ +// +// PSTCKAPIClientTest.m +// Paystack +// + +@import XCTest; + +#import "PSTCKAPIClient.h" + +@interface PSTCKAPIClientTest : XCTestCase +@end + +@implementation PSTCKAPIClientTest + +- (void)testSharedClient { + XCTAssertEqualObjects([PSTCKAPIClient sharedClient], [PSTCKAPIClient sharedClient]); +} + +- (void)testPublishableKey { + [Paystack setDefaultPublishableKey:@"test"]; + PSTCKAPIClient *client = [PSTCKAPIClient sharedClient]; + XCTAssertEqualObjects(client.publishableKey, @"test"); +} + +@end diff --git a/Tests/Tests/PSTCKCardFunctionalTest.m b/Tests/Tests/PSTCKCardFunctionalTest.m new file mode 100644 index 0000000..53db5b8 --- /dev/null +++ b/Tests/Tests/PSTCKCardFunctionalTest.m @@ -0,0 +1,94 @@ +// +// PSTCKCardFunctionalTest.m +// Paystack +// + +@import XCTest; + +#import "Paystack.h" + +@interface PSTCKCardFunctionalTest : XCTestCase +@end + +@implementation PSTCKCardFunctionalTest + +- (void)testCreateCardToken { + PSTCKCardParams *card = [[PSTCKCardParams alloc] init]; + + card.number = @"4242424242424242"; + card.cvc = @"222"; + card.expMonth = 11; + card.expYear = 2018; + card.currency = @"usd"; + card.addressLine1 = @"123 Fake Street"; + card.addressLine2 = @"Apartment 4"; + card.addressCity = @"New York"; + card.addressState = @"NY"; + card.addressCountry = @"USA"; + card.addressZip = @"10002"; + + PSTCKAPIClient *client = [[PSTCKAPIClient alloc] initWithPublishableKey:@"pk_test_vOo1umqsYxSrP5UXfOeL3ecm"]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Card creation"]; + + [client createTokenWithCard:card + completion:^(PSTCKToken *token, NSError *error) { + [expectation fulfill]; + + XCTAssertNil(error, @"error should be nil %@", error.localizedDescription); + XCTAssertNotNil(token, @"token should not be nil"); + + XCTAssertNotNil(token.tokenId); +// XCTAssertEqual(6U, token.card.expMonth); +// XCTAssertEqual(2018U, token.card.expYear); + XCTAssertEqualObjects(@"4242", token.last4); +// XCTAssertEqualObjects(@"usd", token.card.currency); + }]; + [self waitForExpectationsWithTimeout:60.0f handler:nil]; +} + +- (void)testCardTokenCreationWithInvalidParams { + PSTCKCardParams *card = [[PSTCKCardParams alloc] init]; + + card.number = @"4242 4242 4242 4241"; + card.expMonth = 6; + card.expYear = 2018; + + PSTCKAPIClient *client = [[PSTCKAPIClient alloc] initWithPublishableKey:@"pk_test_vOo1umqsYxSrP5UXfOeL3ecm"]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Card creation"]; + + [client createTokenWithCard:card + completion:^(PSTCKToken *token, NSError *error) { + [expectation fulfill]; + + XCTAssertNotNil(error, @"error should not be nil"); + XCTAssertEqual(error.code, 60); + XCTAssertEqualObjects(error.domain, PaystackDomain); +// XCTAssertEqualObjects(error.userInfo[PSTCKErrorParameterKey], @"number"); + XCTAssertNil(token, @"token should be nil: %@", token.description); + }]; + [self waitForExpectationsWithTimeout:5.0f handler:nil]; +} + +- (void)testInvalidKey { + PSTCKCardParams *card = [[PSTCKCardParams alloc] init]; + + card.number = @"4242 4242 4242 4242"; + card.expMonth = 6; + card.expYear = 2018; + + PSTCKAPIClient *client = [[PSTCKAPIClient alloc] initWithPublishableKey:@"not_a_valid_key_asdf"]; + + XCTestExpectation *expectation = [self expectationWithDescription:@"Card failure"]; + [client createTokenWithCard:card + completion:^(PSTCKToken *token, NSError *error) { + [expectation fulfill]; + XCTAssertNil(token, @"token should be nil"); + XCTAssertNotNil(error, @"error should not be nil"); + XCTAssert([error.localizedDescription rangeOfString:@"asdf"].location != NSNotFound, @"error should contain last 4 of key"); + }]; + [self waitForExpectationsWithTimeout:5.0f handler:nil]; +} + +@end diff --git a/Tests/Tests/PSTCKCardTest.m b/Tests/Tests/PSTCKCardTest.m new file mode 100644 index 0000000..dc61508 --- /dev/null +++ b/Tests/Tests/PSTCKCardTest.m @@ -0,0 +1,106 @@ +// +// PSTCKCardTest.m +// Paystack +// + +@import XCTest; + +#import "PSTCKFormEncoder.h" +#import "PSTCKCard.h" +#import "PaystackError.h" + +@interface PSTCKCardTest : XCTestCase +@property (nonatomic) PSTCKCardParams *card; +@end + +@implementation PSTCKCardTest + +- (void)setUp { + _card = [[PSTCKCardParams alloc] init]; +} + +#pragma mark Helpers +- (NSDictionary *)completeAttributeDictionary { + return @{ + @"id": @"1", + @"exp_month": @"12", + @"exp_year": @"2013", + @"name": @"Smerlock Smolmes", + @"address_line1": @"221A Baker Street", + @"address_city": @"New York", + @"address_state": @"NY", + @"address_zip": @"12345", + @"address_country": @"USA", + @"last4": @"1234", + @"dynamic_last4": @"5678", + @"brand": @"MasterCard", + @"country": @"Japan", + @"currency": @"usd", + }; +} + +- (void)testInitializingCardWithAttributeDictionary { + NSMutableDictionary *apiResponse = [[self completeAttributeDictionary] mutableCopy]; + apiResponse[@"foo"] = @"bar"; + apiResponse[@"nested"] = @{@"baz": @"bang"}; + + + PSTCKCard *cardWithAttributes = [PSTCKCard decodedObjectFromAPIResponse:apiResponse]; + XCTAssertTrue([cardWithAttributes expMonth] == 12, @"expMonth is set correctly"); + XCTAssertTrue([cardWithAttributes expYear] == 2013, @"expYear is set correctly"); + XCTAssertEqualObjects([cardWithAttributes name], @"Smerlock Smolmes", @"name is set correctly"); + XCTAssertEqualObjects([cardWithAttributes addressLine1], @"221A Baker Street", @"addressLine1 is set correctly"); + XCTAssertEqualObjects([cardWithAttributes addressCity], @"New York", @"addressCity is set correctly"); + XCTAssertEqualObjects([cardWithAttributes addressState], @"NY", @"addressState is set correctly"); + XCTAssertEqualObjects([cardWithAttributes addressZip], @"12345", @"addressZip is set correctly"); + XCTAssertEqualObjects([cardWithAttributes addressCountry], @"USA", @"addressCountry is set correctly"); + XCTAssertEqualObjects([cardWithAttributes last4], @"1234", @"last4 is set correctly"); + XCTAssertEqualObjects([cardWithAttributes dynamicLast4], @"5678", @"last4 is set correctly"); + XCTAssertEqual([cardWithAttributes brand], PSTCKCardBrandMasterCard, @"type is set correctly"); + XCTAssertEqualObjects([cardWithAttributes country], @"Japan", @"country is set correctly"); + XCTAssertEqualObjects([cardWithAttributes currency], @"usd", @"currency is set correctly"); + + NSDictionary *allResponseFields = cardWithAttributes.allResponseFields; + XCTAssertEqual(allResponseFields[@"foo"], @"bar"); + XCTAssertEqual(allResponseFields[@"last4"], @"1234"); + XCTAssertEqualObjects(allResponseFields[@"nested"], @{@"baz": @"bang"}); + XCTAssertNil(allResponseFields[@"baz"]); +} + +#pragma mark - last4 tests +- (void)testLast4ReturnsCardNumberLast4WhenNotSet { + self.card.number = @"4242424242424242"; + XCTAssertEqualObjects(self.card.last4, @"4242", @"last4 correctly returns the last 4 digits of the card number"); +} + +- (void)testLast4ReturnsNullWhenNoCardNumberSet { + XCTAssertEqualObjects(nil, self.card.last4, @"last4 returns nil when nothing is set"); +} + +- (void)testLast4ReturnsNullWhenCardNumberIsLessThanLength4 { + self.card.number = @"123"; + XCTAssertEqualObjects(nil, self.card.last4, @"last4 returns nil when number length is < 3"); +} + +- (void)testCardEquals { + PSTCKCard *card1 = [PSTCKCard decodedObjectFromAPIResponse:[self completeAttributeDictionary]]; + PSTCKCard *card2 = [PSTCKCard decodedObjectFromAPIResponse:[self completeAttributeDictionary]]; + + XCTAssertEqualObjects(card1, card1, @"card should equal itself"); + XCTAssertEqualObjects(card1, card2, @"cards with equal data should be equal"); +} + +#pragma mark - validation tests +- (void)testValidateCardReturningError_january { + PSTCKCardParams *params = [[PSTCKCardParams alloc] init]; + params.number = @"4242424242424242"; + params.expMonth = 01; + params.expYear = 18; + params.cvc = @"123"; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated" + XCTAssert([params validateCardReturningError:nil]); +#pragma clang diagnostic pop +} + +@end diff --git a/Tests/Tests/PSTCKCardValidatorTest.m b/Tests/Tests/PSTCKCardValidatorTest.m new file mode 100644 index 0000000..c682674 --- /dev/null +++ b/Tests/Tests/PSTCKCardValidatorTest.m @@ -0,0 +1,240 @@ +// +// PSTCKCardValidatorTest.m +// Paystack +// + +@import UIKit; +@import XCTest; + +#import "PSTCKCardValidationState.h" +#import "PSTCKCardValidator.h" + +@interface PSTCKCardValidatorTest : XCTestCase +@end + +@implementation PSTCKCardValidatorTest + ++ (NSArray *)cardData { + return @[ + @[@(PSTCKCardBrandVisa), @"4242424242424242", @(PSTCKCardValidationStateValid)], + @[@(PSTCKCardBrandVisa), @"4012888888881881", @(PSTCKCardValidationStateValid)], + @[@(PSTCKCardBrandVisa), @"4000056655665556", @(PSTCKCardValidationStateValid)], + @[@(PSTCKCardBrandMasterCard), @"5555555555554444", @(PSTCKCardValidationStateValid)], + @[@(PSTCKCardBrandMasterCard), @"5200828282828210", @(PSTCKCardValidationStateValid)], + @[@(PSTCKCardBrandMasterCard), @"5105105105105100", @(PSTCKCardValidationStateValid)], + @[@(PSTCKCardBrandAmex), @"378282246310005", @(PSTCKCardValidationStateValid)], + @[@(PSTCKCardBrandAmex), @"371449635398431", @(PSTCKCardValidationStateValid)], + @[@(PSTCKCardBrandDiscover), @"6011111111111117", @(PSTCKCardValidationStateValid)], + @[@(PSTCKCardBrandDiscover), @"6011000990139424", @(PSTCKCardValidationStateValid)], + @[@(PSTCKCardBrandDinersClub), @"30569309025904", @(PSTCKCardValidationStateValid)], + @[@(PSTCKCardBrandDinersClub), @"38520000023237", @(PSTCKCardValidationStateValid)], + @[@(PSTCKCardBrandJCB), @"3530111333300000", @(PSTCKCardValidationStateValid)], + @[@(PSTCKCardBrandJCB), @"3566002020360505", @(PSTCKCardValidationStateValid)], + @[@(PSTCKCardBrandUnknown), @"1234567812345678", @(PSTCKCardValidationStateInvalid)], + ]; +} + +- (void)testNumberSanitization { + NSArray *tests = @[ + @[@"4242424242424242", @"4242424242424242"], + @[@"XXXXXX", @""], + @[@"424242424242424X", @"424242424242424"], + ]; + for (NSArray *test in tests) { + XCTAssertEqualObjects([PSTCKCardValidator sanitizedNumericStringForString:test[0]], test[1]); + } +} + +- (void)testNumberValidation { + NSMutableArray *tests = [@[] mutableCopy]; + + for (NSArray *card in [self.class cardData]) { + [tests addObject:@[card[2], card[1]]]; + } + + [tests addObject:@[@(PSTCKCardValidationStateValid), @"4242 4242 4242 4242"]]; + + NSArray *badCardNumbers = @[ + @"0000000000000000", + @"9999999999999995", + @"1", + @"1234123412341234", + @"xxx", + @"9999999999999999999999", + @"42424242424242424242", + @"4242-4242-4242-4242", + ]; + + for (NSString *card in badCardNumbers) { + [tests addObject:@[@(PSTCKCardValidationStateInvalid), card]]; + } + + NSArray *possibleCardNumbers = @[ + @"4242", + @"5", + @"3", + @"", + @" ", + @"6011", + ]; + + for (NSString *card in possibleCardNumbers) { + [tests addObject:@[@(PSTCKCardValidationStateIncomplete), card]]; + } + + for (NSArray *test in tests) { + NSString *card = test[1]; + NSNumber *validationState = @([PSTCKCardValidator validationStateForNumber:card validatingCardBrand:YES]); + NSNumber *expected = test[0]; + if (![validationState isEqual:expected]) { + XCTFail(); + } + } + + XCTAssertEqual(PSTCKCardValidationStateIncomplete, [PSTCKCardValidator validationStateForNumber:@"1" validatingCardBrand:NO]); + XCTAssertEqual(PSTCKCardValidationStateValid, [PSTCKCardValidator validationStateForNumber:@"0000000000000000" validatingCardBrand:NO]); + XCTAssertEqual(PSTCKCardValidationStateValid, [PSTCKCardValidator validationStateForNumber:@"9999999999999995" validatingCardBrand:NO]); +} + +- (void)testBrand { + for (NSArray *test in [self.class cardData]) { + XCTAssertEqualObjects(@([PSTCKCardValidator brandForNumber:test[1]]), test[0]); + } +} + +- (void)testBrandNumberLength { + NSArray *tests = @[ + @[@(PSTCKCardBrandVisa), @16], + @[@(PSTCKCardBrandMasterCard), @16], + @[@(PSTCKCardBrandAmex), @15], + @[@(PSTCKCardBrandDiscover), @16], + @[@(PSTCKCardBrandDinersClub), @14], + @[@(PSTCKCardBrandJCB), @16], + @[@(PSTCKCardBrandUnknown), @16], + ]; + for (NSArray *test in tests) { + XCTAssertEqualObjects(@([PSTCKCardValidator lengthForCardBrand:[test[0] integerValue]]), test[1]); + } +} + +- (void)testFragmentLength { + NSArray *tests = @[ + @[@(PSTCKCardBrandVisa), @4], + @[@(PSTCKCardBrandMasterCard), @4], + @[@(PSTCKCardBrandAmex), @5], + @[@(PSTCKCardBrandDiscover), @4], + @[@(PSTCKCardBrandDinersClub), @2], + @[@(PSTCKCardBrandJCB), @4], + @[@(PSTCKCardBrandUnknown), @4], + ]; + for (NSArray *test in tests) { + XCTAssertEqualObjects(@([PSTCKCardValidator fragmentLengthForCardBrand:[test[0] integerValue]]), test[1]); + } +} + +- (void)testMonthValidation { + NSArray *tests = @[ + @[@"", @(PSTCKCardValidationStateIncomplete)], + @[@"0", @(PSTCKCardValidationStateIncomplete)], + @[@"1", @(PSTCKCardValidationStateIncomplete)], + @[@"2", @(PSTCKCardValidationStateValid)], + @[@"9", @(PSTCKCardValidationStateValid)], + @[@"10", @(PSTCKCardValidationStateValid)], + @[@"12", @(PSTCKCardValidationStateValid)], + @[@"13", @(PSTCKCardValidationStateInvalid)], + @[@"11a", @(PSTCKCardValidationStateInvalid)], + @[@"x", @(PSTCKCardValidationStateInvalid)], + @[@"100", @(PSTCKCardValidationStateInvalid)], + @[@"00", @(PSTCKCardValidationStateInvalid)], + @[@"13", @(PSTCKCardValidationStateInvalid)], + ]; + for (NSArray *test in tests) { + XCTAssertEqualObjects(@([PSTCKCardValidator validationStateForExpirationMonth:test[0]]), test[1]); + } +} + +- (void)testYearValidation { + NSArray *tests = @[ + @[@"12", @"15", @(PSTCKCardValidationStateValid)], + @[@"8", @"15", @(PSTCKCardValidationStateValid)], + @[@"9", @"15", @(PSTCKCardValidationStateValid)], + @[@"11", @"16", @(PSTCKCardValidationStateValid)], + @[@"11", @"99", @(PSTCKCardValidationStateValid)], + @[@"00", @"99", @(PSTCKCardValidationStateValid)], + @[@"12", @"14", @(PSTCKCardValidationStateInvalid)], + @[@"7", @"15", @(PSTCKCardValidationStateInvalid)], + @[@"12", @"00", @(PSTCKCardValidationStateInvalid)], + @[@"12", @"2", @(PSTCKCardValidationStateIncomplete)], + @[@"12", @"1", @(PSTCKCardValidationStateIncomplete)], + @[@"12", @"0", @(PSTCKCardValidationStateIncomplete)], + ]; + + for (NSArray *test in tests) { + PSTCKCardValidationState state = [PSTCKCardValidator validationStateForExpirationYear:test[1] inMonth:test[0] inCurrentYear:15 currentMonth:8]; + XCTAssertEqualObjects(@(state), test[2]); + } +} + +- (void)testCVCLength { + NSArray *tests = @[ + @[@(PSTCKCardBrandVisa), @3], + @[@(PSTCKCardBrandMasterCard), @3], + @[@(PSTCKCardBrandAmex), @4], + @[@(PSTCKCardBrandDiscover), @3], + @[@(PSTCKCardBrandDinersClub), @3], + @[@(PSTCKCardBrandJCB), @3], + @[@(PSTCKCardBrandUnknown), @4], + ]; + for (NSArray *test in tests) { + XCTAssertEqualObjects(@([PSTCKCardValidator maxCVCLengthForCardBrand:[test[0] integerValue]]), test[1]); + } +} + +- (void)testCVCValidation { + NSArray *tests = @[ + @[@"x", @(PSTCKCardBrandVisa), @(PSTCKCardValidationStateInvalid)], + @[@"", @(PSTCKCardBrandVisa), @(PSTCKCardValidationStateIncomplete)], + @[@"1", @(PSTCKCardBrandVisa), @(PSTCKCardValidationStateIncomplete)], + @[@"12", @(PSTCKCardBrandVisa), @(PSTCKCardValidationStateIncomplete)], + @[@"1x3", @(PSTCKCardBrandVisa), @(PSTCKCardValidationStateInvalid)], + @[@"123", @(PSTCKCardBrandVisa), @(PSTCKCardValidationStateValid)], + @[@"123", @(PSTCKCardBrandAmex), @(PSTCKCardValidationStateValid)], + @[@"123", @(PSTCKCardBrandUnknown), @(PSTCKCardValidationStateValid)], + @[@"1234", @(PSTCKCardBrandVisa), @(PSTCKCardValidationStateInvalid)], + @[@"1234", @(PSTCKCardBrandAmex), @(PSTCKCardValidationStateValid)], + @[@"12345", @(PSTCKCardBrandAmex), @(PSTCKCardValidationStateInvalid)], + ]; + + for (NSArray *test in tests) { + PSTCKCardValidationState state = [PSTCKCardValidator validationStateForCVC:test[0] cardBrand:[test[1] integerValue]]; + XCTAssertEqualObjects(@(state), test[2]); + } +} + +- (void)testCardValidation { + NSArray *tests = @[ + @[@"4242424242424242", @(12), @(15), @"123", @(PSTCKCardValidationStateValid)], + @[@"4242424242424242", @(12), @(15), @"x", @(PSTCKCardValidationStateInvalid)], + @[@"4242424242424242", @(12), @(15), @"1", @(PSTCKCardValidationStateIncomplete)], + @[@"4242424242424242", @(12), @(14), @"123", @(PSTCKCardValidationStateInvalid)], + @[@"4242424242424242", @(21), @(15), @"123", @(PSTCKCardValidationStateInvalid)], + @[@"42424242", @(12), @(15), @"123", @(PSTCKCardValidationStateIncomplete)], + @[@"378282246310005", @(12), @(15), @"1234", @(PSTCKCardValidationStateValid)], + @[@"378282246310005", @(12), @(15), @"123", @(PSTCKCardValidationStateValid)], + @[@"378282246310005", @(12), @(15), @"12345", @(PSTCKCardValidationStateInvalid)], + @[@"1234567812345678", @(12), @(15), @"12345", @(PSTCKCardValidationStateInvalid)], + ]; + for (NSArray *test in tests) { + PSTCKCardParams *card = [[PSTCKCardParams alloc] init]; + card.number = test[0]; + card.expMonth = [test[1] integerValue]; + card.expYear = [test[2] integerValue]; + card.cvc = test[3]; + PSTCKCardValidationState state = [PSTCKCardValidator validationStateForCard:card + inCurrentYear:15 currentMonth:8]; + XCTAssertEqualObjects(@(state), test[4]); + } +} + + +@end diff --git a/Tests/Tests/PSTCKCertTest.m b/Tests/Tests/PSTCKCertTest.m new file mode 100644 index 0000000..0612671 --- /dev/null +++ b/Tests/Tests/PSTCKCertTest.m @@ -0,0 +1,73 @@ +// +// PSTCKCertTest.m +// Paystack +// + +@import XCTest; + +#import "PSTCKAPIClient.h" +#import "PSTCKAPIClient+Private.h" +#import "Paystack.h" + +NSString *const PSTCKExamplePublishableKey = @"bad_key"; + +@interface PSTCKAPIClient (Failure) +@property (nonatomic, readwrite) NSURL *apiURL; +@end + +@interface PSTCKCertTest : XCTestCase +@end + +@implementation PSTCKCertTest + +- (void)testNoError { + XCTestExpectation *expectation = [self expectationWithDescription:@"Token creation"]; + PSTCKAPIClient *client = [[PSTCKAPIClient alloc] initWithPublishableKey:PSTCKExamplePublishableKey]; + [client createTokenWithData:[NSData new] + completion:^(PSTCKToken *token, NSError *error) { + [expectation fulfill]; + // Note that this API request *will* fail, but it will return error + // messages from the server and not be blocked by local cert checks + XCTAssertNil(token, @"Expected no token"); + XCTAssertNotNil(error, @"Expected error"); + }]; + [self waitForExpectationsWithTimeout:60.0f handler:nil]; +} + +- (void)testExpired { + [self createTokenWithBaseURL:[NSURL URLWithString:@"https://testssl-expire.disig.sk/index.en.html"] + completion:^(PSTCKToken *token, NSError *error) { + XCTAssertNil(token, @"Token should be nil."); + XCTAssertEqualObjects(error.domain, @"NSURLErrorDomain", @"Error should be NSURLErrorDomain"); + XCTAssertNotNil(error.userInfo[@"NSURLErrorFailingURLPeerTrustErrorKey"], + @"There should be a secTustRef for Foundation HTTPS errors"); + }]; +} + +- (void)testMismatched { + [self createTokenWithBaseURL:[NSURL URLWithString:@"https://mismatched.paystack.com"] + completion:^(PSTCKToken *token, NSError *error) { + XCTAssertNil(token, @"Token should be nil."); + XCTAssertEqualObjects(error.domain, @"NSURLErrorDomain", @"Error should be NSURLErrorDomain"); + }]; +} + +// helper method +- (void)createTokenWithBaseURL:(NSURL *)baseURL completion:(PSTCKTokenCompletionBlock)completion { + XCTestExpectation *expectation = [self expectationWithDescription:@"Token creation"]; + PSTCKAPIClient *client = [[PSTCKAPIClient alloc] initWithPublishableKey:PSTCKExamplePublishableKey]; + client.apiURL = baseURL; + [client createTokenWithData:[NSData new] + completion:^(PSTCKToken *token, NSError *error) { + [expectation fulfill]; + completion(token, error); + }]; + + [self waitForExpectationsWithTimeout:10.0f handler:nil]; +} + +@end + +@implementation PSTCKAPIClient (Failure) +@dynamic apiURL; +@end diff --git a/Tests/Tests/PSTCKFormEncoderTest.m b/Tests/Tests/PSTCKFormEncoderTest.m new file mode 100644 index 0000000..9444b3f --- /dev/null +++ b/Tests/Tests/PSTCKFormEncoderTest.m @@ -0,0 +1,109 @@ +// +// PSTCKFormEncoderTest.m +// Paystack Tests +// + +@import XCTest; +#import "PSTCKFormEncoder.h" +#import "PSTCKFormEncodable.h" + +@interface PSTCKTestFormEncodableObject : NSObject +@property(nonatomic) NSString *testProperty; +@property(nonatomic) NSString *testIgnoredProperty; +@property(nonatomic) NSArray *testArrayProperty; +@property(nonatomic) NSDictionary *testDictionaryProperty; +@property(nonatomic) PSTCKTestFormEncodableObject *testNestedObjectProperty; +@end + +@implementation PSTCKTestFormEncodableObject + +@synthesize additionalAPIParameters; + ++ (NSString *)rootObjectName { + return @"test_object"; +} + ++ (NSDictionary *)propertyNamesToFormFieldNamesMapping { + return @{ + @"testProperty": @"test_property", + @"testArrayProperty": @"test_array_property", + @"testDictionaryProperty": @"test_dictionary_property", + @"testNestedObjectProperty": @"test_nested_property", + }; +} + +@end + +@interface PSTCKFormEncoderTest : XCTestCase +@end + +@implementation PSTCKFormEncoderTest + +- (void)testStringByReplacingSnakeCaseWithCamelCase { + NSString *camelCase = [PSTCKFormEncoder stringByReplacingSnakeCaseWithCamelCase:@"test_1_2_34_test"]; + XCTAssertEqualObjects(@"test1234Test", camelCase); +} + +// helper test method +- (NSString *)encodeObject:(PSTCKTestFormEncodableObject *)object { + NSData *encoded = [PSTCKFormEncoder formEncryptedDataForCard:object]; + return [[[NSString alloc] initWithData:encoded encoding:NSUTF8StringEncoding] stringByRemovingPercentEncoding]; +} + +- (void)testFormEncoding_emptyObject { + PSTCKTestFormEncodableObject *testObject = [PSTCKTestFormEncodableObject new]; + XCTAssertEqualObjects([self encodeObject:testObject], @""); +} + +- (void)testFormEncoding_normalObject { + PSTCKTestFormEncodableObject *testObject = [PSTCKTestFormEncodableObject new]; + testObject.testProperty = @"success"; + testObject.testIgnoredProperty = @"ignoreme"; + XCTAssertEqualObjects([self encodeObject:testObject], @"test_object[test_property]=success"); +} + +- (void)testFormEncoding_additionalAttributes { + PSTCKTestFormEncodableObject *testObject = [PSTCKTestFormEncodableObject new]; + testObject.testProperty = @"success"; + testObject.additionalAPIParameters = @{@"foo": @"bar", @"nested": @{@"nested_key": @"nested_value"}}; + XCTAssertEqualObjects([self encodeObject:testObject], @"test_object[foo]=bar&test_object[nested][nested_key]=nested_value&test_object[test_property]=success"); +} + +- (void)testFormEncoding_arrayValue_empty { + PSTCKTestFormEncodableObject *testObject = [PSTCKTestFormEncodableObject new]; + testObject.testProperty = @"success"; + testObject.testArrayProperty = @[]; + XCTAssertEqualObjects([self encodeObject:testObject], @"test_object[test_property]=success"); +} + +- (void)testFormEncoding_arrayValue { + PSTCKTestFormEncodableObject *testObject = [PSTCKTestFormEncodableObject new]; + testObject.testProperty = @"success"; + testObject.testArrayProperty = @[@1, @2, @3]; + XCTAssertEqualObjects([self encodeObject:testObject], @"test_object[test_array_property][]=1&test_object[test_array_property][]=2&test_object[test_array_property][]=3&test_object[test_property]=success"); +} + +- (void)testFormEncoding_dictionaryValue_empty { + PSTCKTestFormEncodableObject *testObject = [PSTCKTestFormEncodableObject new]; + testObject.testProperty = @"success"; + testObject.testDictionaryProperty = @{}; + XCTAssertEqualObjects([self encodeObject:testObject], @"test_object[test_property]=success"); +} + +- (void)testFormEncoding_dictionaryValue { + PSTCKTestFormEncodableObject *testObject = [PSTCKTestFormEncodableObject new]; + testObject.testProperty = @"success"; + testObject.testDictionaryProperty = @{@"foo": @"bar"}; + XCTAssertEqualObjects([self encodeObject:testObject], @"test_object[test_dictionary_property][foo]=bar&test_object[test_property]=success"); +} + +- (void)testFormEncoding_nestedValue { + PSTCKTestFormEncodableObject *testObject1 = [PSTCKTestFormEncodableObject new]; + PSTCKTestFormEncodableObject *testObject2 = [PSTCKTestFormEncodableObject new]; + testObject2.testProperty = @"nested_object"; + testObject1.testProperty = @"success"; + testObject1.testNestedObjectProperty = testObject2; + XCTAssertEqualObjects([self encodeObject:testObject1], @"test_object[test_nested_property][test_property]=nested_object&test_object[test_property]=success"); +} + +@end diff --git a/Tests/Tests/PSTCKPaymentCardTextFieldTest.m b/Tests/Tests/PSTCKPaymentCardTextFieldTest.m new file mode 100644 index 0000000..c4f7def --- /dev/null +++ b/Tests/Tests/PSTCKPaymentCardTextFieldTest.m @@ -0,0 +1,241 @@ +// +// PSTCKPaymentCardTextFieldTest.m +// Paystack +// + +@import UIKit; +@import XCTest; + +#import "Paystack.h" +#import "PSTCKFormTextField.h" +#import "PSTCKPaymentCardTextFieldViewModel.h" + +@interface PSTCKPaymentCardTextField (Testing) +@property(nonatomic, readwrite, weak)UIImageView *brandImageView; +@property(nonatomic, readwrite, weak)PSTCKFormTextField *numberField; +@property(nonatomic, readwrite, weak)PSTCKFormTextField *expirationField; +@property(nonatomic, readwrite, weak)PSTCKFormTextField *cvcField; +@property(nonatomic, readwrite, weak)UITextField *selectedField; +@property(nonatomic, assign)BOOL numberFieldShrunk; ++ (UIImage *)cvcImageForCardBrand:(PSTCKCardBrand)cardBrand; ++ (UIImage *)brandImageForCardBrand:(PSTCKCardBrand)cardBrand; +@end + +@interface PSTCKPaymentCardTextFieldTest : XCTestCase +@end + +@implementation PSTCKPaymentCardTextFieldTest + +- (void)testIntrinsicContentSize { + PSTCKPaymentCardTextField *textField = [PSTCKPaymentCardTextField new]; + + UIFont *iOS8SystemFont = [UIFont fontWithName:@"HelveticaNeue" size:18]; + textField.font = iOS8SystemFont; + XCTAssertEqualWithAccuracy(textField.intrinsicContentSize.height, 44, 0.1); + XCTAssertEqualWithAccuracy(textField.intrinsicContentSize.width, 257, 0.1); + + UIFont *iOS9SystemFont = [UIFont fontWithName:@".SFUIText-Regular" size:18]; + if (iOS9SystemFont) { + textField.font = iOS9SystemFont; + XCTAssertEqualWithAccuracy(textField.intrinsicContentSize.height, 44, 0.1); + XCTAssertEqualWithAccuracy(textField.intrinsicContentSize.width, 270, 0.1); + } + + textField.font = [UIFont fontWithName:@"Avenir" size:44]; + XCTAssertEqualWithAccuracy(textField.intrinsicContentSize.height, 60, 0.1); + XCTAssertEqualWithAccuracy(textField.intrinsicContentSize.width, 488, 0.1); +} + +- (void)testSetCard_numberUnknown { + PSTCKPaymentCardTextField *sut = [PSTCKPaymentCardTextField new]; + PSTCKCardParams *card = [PSTCKCardParams new]; + NSString *number = @"1"; + card.number = number; + [sut setCardParams:card]; + NSData *imgData = UIImagePNGRepresentation(sut.brandImageView.image); + NSData *expectedImgData = UIImagePNGRepresentation([PSTCKPaymentCardTextField brandImageForCardBrand:PSTCKCardBrandUnknown]); + + XCTAssertFalse(sut.numberFieldShrunk); + XCTAssertTrue([expectedImgData isEqualToData:imgData]); + XCTAssertEqualObjects(sut.numberField.text, number); + XCTAssertEqual(sut.expirationField.text.length, (NSUInteger)0); + XCTAssertEqual(sut.cvcField.text.length, (NSUInteger)0); + XCTAssertNil(sut.selectedField); +} + +- (void)testSetCard_expiration { + PSTCKPaymentCardTextField *sut = [PSTCKPaymentCardTextField new]; + PSTCKCardParams *card = [PSTCKCardParams new]; + card.expMonth = 10; + card.expYear = 99; + [sut setCardParams:card]; + NSData *imgData = UIImagePNGRepresentation(sut.brandImageView.image); + NSData *expectedImgData = UIImagePNGRepresentation([PSTCKPaymentCardTextField brandImageForCardBrand:PSTCKCardBrandUnknown]); + + XCTAssertFalse(sut.numberFieldShrunk); + XCTAssertTrue([expectedImgData isEqualToData:imgData]); + XCTAssertEqual(sut.numberField.text.length, (NSUInteger)0); + XCTAssertEqualObjects(sut.expirationField.text, @"10/99"); + XCTAssertEqual(sut.cvcField.text.length, (NSUInteger)0); + XCTAssertNil(sut.selectedField); + XCTAssertFalse(sut.isValid); +} + +- (void)testSetCard_CVC { + PSTCKPaymentCardTextField *sut = [PSTCKPaymentCardTextField new]; + PSTCKCardParams *card = [PSTCKCardParams new]; + NSString *cvc = @"123"; + card.cvc = cvc; + [sut setCardParams:card]; + NSData *imgData = UIImagePNGRepresentation(sut.brandImageView.image); + NSData *expectedImgData = UIImagePNGRepresentation([PSTCKPaymentCardTextField brandImageForCardBrand:PSTCKCardBrandUnknown]); + + XCTAssertFalse(sut.numberFieldShrunk); + XCTAssertTrue([expectedImgData isEqualToData:imgData]); + XCTAssertEqual(sut.numberField.text.length, (NSUInteger)0); + XCTAssertEqual(sut.expirationField.text.length, (NSUInteger)0); + XCTAssertEqualObjects(sut.cvcField.text, cvc); + XCTAssertNil(sut.selectedField); + XCTAssertFalse(sut.isValid); +} + +- (void)testSetCard_numberVisa { + PSTCKPaymentCardTextField *sut = [PSTCKPaymentCardTextField new]; + PSTCKCardParams *card = [PSTCKCardParams new]; + NSString *number = @"4242"; + card.number = number; + [sut setCardParams:card]; + NSData *imgData = UIImagePNGRepresentation(sut.brandImageView.image); + NSData *expectedImgData = UIImagePNGRepresentation([PSTCKPaymentCardTextField brandImageForCardBrand:PSTCKCardBrandVisa]); + + XCTAssertFalse(sut.numberFieldShrunk); + XCTAssertTrue([expectedImgData isEqualToData:imgData]); + XCTAssertEqualObjects(sut.numberField.text, number); + XCTAssertEqual(sut.expirationField.text.length, (NSUInteger)0); + XCTAssertEqual(sut.cvcField.text.length, (NSUInteger)0); + XCTAssertNil(sut.selectedField); + XCTAssertFalse(sut.isValid); +} + +- (void)testSetCard_numberAndExpiration { + PSTCKPaymentCardTextField *sut = [PSTCKPaymentCardTextField new]; + PSTCKCardParams *card = [PSTCKCardParams new]; + NSString *number = @"4242424242424242"; + card.number = number; + card.expMonth = 10; + card.expYear = 99; + [sut setCardParams:card]; + NSData *imgData = UIImagePNGRepresentation(sut.brandImageView.image); + NSData *expectedImgData = UIImagePNGRepresentation([PSTCKPaymentCardTextField brandImageForCardBrand:PSTCKCardBrandVisa]); + + XCTAssertTrue(sut.numberFieldShrunk); + XCTAssertTrue([expectedImgData isEqualToData:imgData]); + XCTAssertEqualObjects(sut.numberField.text, number); + XCTAssertEqualObjects(sut.expirationField.text, @"10/99"); + XCTAssertEqual(sut.cvcField.text.length, (NSUInteger)0); + XCTAssertNil(sut.selectedField); + XCTAssertFalse(sut.isValid); +} + +- (void)testSetCard_partialNumberAndExpiration { + PSTCKPaymentCardTextField *sut = [PSTCKPaymentCardTextField new]; + PSTCKCardParams *card = [PSTCKCardParams new]; + NSString *number = @"42"; + card.number = number; + card.expMonth = 10; + card.expYear = 99; + [sut setCardParams:card]; + NSData *imgData = UIImagePNGRepresentation(sut.brandImageView.image); + NSData *expectedImgData = UIImagePNGRepresentation([PSTCKPaymentCardTextField brandImageForCardBrand:PSTCKCardBrandVisa]); + + XCTAssertFalse(sut.numberFieldShrunk); + XCTAssertTrue([expectedImgData isEqualToData:imgData]); + XCTAssertEqualObjects(sut.numberField.text, number); + XCTAssertEqualObjects(sut.expirationField.text, @"10/99"); + XCTAssertEqual(sut.cvcField.text.length, (NSUInteger)0); + XCTAssertNil(sut.selectedField); + XCTAssertFalse(sut.isValid); +} + +- (void)testSetCard_numberAndCVC { + PSTCKPaymentCardTextField *sut = [PSTCKPaymentCardTextField new]; + PSTCKCardParams *card = [PSTCKCardParams new]; + NSString *number = @"378282246310005"; + NSString *cvc = @"123"; + card.number = number; + card.cvc = cvc; + [sut setCardParams:card]; + NSData *imgData = UIImagePNGRepresentation(sut.brandImageView.image); + NSData *expectedImgData = UIImagePNGRepresentation([PSTCKPaymentCardTextField brandImageForCardBrand:PSTCKCardBrandAmex]); + + XCTAssertTrue(sut.numberFieldShrunk); + XCTAssertTrue([expectedImgData isEqualToData:imgData]); + XCTAssertEqualObjects(sut.numberField.text, number); + XCTAssertEqual(sut.expirationField.text.length, (NSUInteger)0); + XCTAssertEqualObjects(sut.cvcField.text, cvc); + XCTAssertNil(sut.selectedField); + XCTAssertFalse(sut.isValid); +} + +- (void)testSetCard_expirationAndCVC { + PSTCKPaymentCardTextField *sut = [PSTCKPaymentCardTextField new]; + PSTCKCardParams *card = [PSTCKCardParams new]; + NSString *cvc = @"123"; + card.expMonth = 10; + card.expYear = 99; + card.cvc = cvc; + [sut setCardParams:card]; + NSData *imgData = UIImagePNGRepresentation(sut.brandImageView.image); + NSData *expectedImgData = UIImagePNGRepresentation([PSTCKPaymentCardTextField brandImageForCardBrand:PSTCKCardBrandUnknown]); + + XCTAssertFalse(sut.numberFieldShrunk); + XCTAssertTrue([expectedImgData isEqualToData:imgData]); + XCTAssertEqual(sut.numberField.text.length, (NSUInteger)0); + XCTAssertEqualObjects(sut.expirationField.text, @"10/99"); + XCTAssertEqualObjects(sut.cvcField.text, cvc); + XCTAssertNil(sut.selectedField); + XCTAssertFalse(sut.isValid); +} + +- (void)testSetCard_completeCard { + PSTCKPaymentCardTextField *sut = [PSTCKPaymentCardTextField new]; + PSTCKCardParams *card = [PSTCKCardParams new]; + NSString *number = @"4242424242424242"; + NSString *cvc = @"123"; + card.number = number; + card.expMonth = 10; + card.expYear = 99; + card.cvc = cvc; + [sut setCardParams:card]; + NSData *imgData = UIImagePNGRepresentation(sut.brandImageView.image); + NSData *expectedImgData = UIImagePNGRepresentation([PSTCKPaymentCardTextField brandImageForCardBrand:PSTCKCardBrandVisa]); + + XCTAssertTrue(sut.numberFieldShrunk); + XCTAssertTrue([expectedImgData isEqualToData:imgData]); + XCTAssertEqualObjects(sut.numberField.text, number); + XCTAssertEqualObjects(sut.expirationField.text, @"10/99"); + XCTAssertEqualObjects(sut.cvcField.text, cvc); + XCTAssertNil(sut.selectedField); + XCTAssertTrue(sut.isValid); +} + +- (void)testSetCard_empty { + PSTCKPaymentCardTextField *sut = [PSTCKPaymentCardTextField new]; + sut.numberField.text = @"4242424242424242"; + sut.cvcField.text = @"123"; + sut.expirationField.text = @"10/99"; + PSTCKCardParams *card = [PSTCKCardParams new]; + [sut setCardParams:card]; + NSData *imgData = UIImagePNGRepresentation(sut.brandImageView.image); + NSData *expectedImgData = UIImagePNGRepresentation([PSTCKPaymentCardTextField brandImageForCardBrand:PSTCKCardBrandUnknown]); + + XCTAssertFalse(sut.numberFieldShrunk); + XCTAssertTrue([expectedImgData isEqualToData:imgData]); + XCTAssertEqual(sut.numberField.text.length, (NSUInteger)0); + XCTAssertEqual(sut.expirationField.text.length, (NSUInteger)0); + XCTAssertEqual(sut.cvcField.text.length, (NSUInteger)0); + XCTAssertNil(sut.selectedField); + XCTAssertFalse(sut.isValid); +} + +@end diff --git a/Tests/Tests/PSTCKPaymentCardTextFieldViewModelTest.m b/Tests/Tests/PSTCKPaymentCardTextFieldViewModelTest.m new file mode 100644 index 0000000..ae930ae --- /dev/null +++ b/Tests/Tests/PSTCKPaymentCardTextFieldViewModelTest.m @@ -0,0 +1,95 @@ +// +// PSTCKCreditCardTextFieldTest.m +// Paystack +// + +@import XCTest; + +#import "Paystack.h" +#import "PSTCKPaymentCardTextFieldViewModel.h" + +@interface PSTCKPaymentCardTextFieldViewModelTest : XCTestCase +@property(nonatomic)PSTCKPaymentCardTextFieldViewModel *viewModel; +@end + +@implementation PSTCKPaymentCardTextFieldViewModelTest + +- (void)setUp { + [super setUp]; + _viewModel = [PSTCKPaymentCardTextFieldViewModel new]; +} + +- (void)testCardNumber { + NSArray *tests = @[ + @[@"", @""], + @[@"4242", @"4242"], + @[@"4242424242424242", @"4242424242424242"], + @[@"4242 4242 4242 4242", @"4242424242424242"], + @[@"4242xxx4242", @"42424242"], + @[@"12345678901234567890", @"1234567890123456"], + ]; + for (NSArray *test in tests) { + self.viewModel.cardNumber = test[0]; + XCTAssertEqualObjects(self.viewModel.cardNumber, test[1]); + } +} + +- (void)testRawExpiration { + NSArray *tests = @[ + @[@"", @"", @"", @"", @(PSTCKCardValidationStateIncomplete)], + @[@"12/23", @"12/23", @"12", @"23", @(PSTCKCardValidationStateValid)], + @[@"1223", @"12/23", @"12", @"23", @(PSTCKCardValidationStateValid)], + @[@"1", @"1", @"1", @"", @(PSTCKCardValidationStateIncomplete)], + @[@"2", @"02/", @"02", @"", @(PSTCKCardValidationStateIncomplete)], + @[@"12", @"12/", @"12", @"", @(PSTCKCardValidationStateIncomplete)], + @[@"12/2", @"12/2", @"12", @"2", @(PSTCKCardValidationStateIncomplete)], + @[@"99/23", @"99", @"99", @"23", @(PSTCKCardValidationStateInvalid)], + @[@"10/12", @"10/12", @"10", @"12", @(PSTCKCardValidationStateInvalid)], + @[@"12*23", @"12/23", @"12", @"23", @(PSTCKCardValidationStateValid)], + @[@"12/*", @"12/", @"12", @"", @(PSTCKCardValidationStateIncomplete)], + @[@"*", @"", @"", @"", @(PSTCKCardValidationStateIncomplete)], + ]; + for (NSArray *test in tests) { + self.viewModel.rawExpiration = test[0]; + XCTAssertEqualObjects(self.viewModel.rawExpiration, test[1]); + XCTAssertEqualObjects(self.viewModel.expirationMonth, test[2]); + XCTAssertEqualObjects(self.viewModel.expirationYear, test[3]); + XCTAssertEqualObjects(@([self.viewModel validationStateForField:PSTCKCardFieldTypeExpiration]), test[4]); + } +} + +- (void)testCVC { + NSArray *tests = @[ + @[@"1", @"1"], + @[@"1234", @"1234"], + @[@"12345", @"1234"], + @[@"1x", @"1"], + ]; + for (NSArray *test in tests) { + self.viewModel.cvc = test[0]; + XCTAssertEqualObjects(self.viewModel.cvc, test[1]); + } +} + +- (void)testNumberWithoutLastDigits { + self.viewModel.cardNumber = @"4242424242424242"; + XCTAssertEqualObjects([self.viewModel numberWithoutLastDigits], @"424242424242"); + + self.viewModel.cardNumber = @"378282246310005"; + XCTAssertEqualObjects([self.viewModel numberWithoutLastDigits], @"3782822463"); + + self.viewModel.cardNumber = @""; + XCTAssertEqualObjects([self.viewModel numberWithoutLastDigits], @"123456781234"); +} + +- (void)testValidity { + self.viewModel.cardNumber = @"4242424242424242"; + self.viewModel.rawExpiration = @"12/24"; + self.viewModel.cvc = @"123"; + XCTAssertTrue([self.viewModel isValid]); + + self.viewModel.cvc = @"12"; + XCTAssertFalse([self.viewModel isValid]); +} + +@end diff --git a/Tests/Tests/PSTCKRSATest.m b/Tests/Tests/PSTCKRSATest.m new file mode 100644 index 0000000..63176ab --- /dev/null +++ b/Tests/Tests/PSTCKRSATest.m @@ -0,0 +1,43 @@ +// +// PSTCKRSATest.m +// Paystack +// +// Created by Ibrahim Lawal on Feb/27/2016. +// Copyright © 2016 Paystack, Inc. All rights reserved. +// + +#import +#import "PSTCKRSA.h" + +@interface PSTCKRSATest : XCTestCase + +@end + +@implementation PSTCKRSATest + +- (void)setUp { + [super setUp]; + // Put setup code here. This method is called before the invocation of each test method in the class. +} + +- (void)tearDown { + // Put teardown code here. This method is called after the invocation of each test method in the class. + [super tearDown]; +} + +- (void)testEncryptRSA { + NSString *encrypted = [PSTCKRSA encryptRSA:@"4123450131001381*883*08*18"]; +// NSLog(@"@%@",encrypted); + // we are fine with getting any value at all + XCTAssertNotNil(encrypted); +} + + +- (void)testPerformanceExample { + // Test the performance of our RSA encryption . + [self measureBlock:^{ + [self testEncryptRSA]; + }]; +} + +@end diff --git a/Tests/Tests/PSTCKTokenTest.m b/Tests/Tests/PSTCKTokenTest.m new file mode 100644 index 0000000..3992f1b --- /dev/null +++ b/Tests/Tests/PSTCKTokenTest.m @@ -0,0 +1,39 @@ +// +// PSTCKTokenTest.m +// Paystack +// + +@import XCTest; + +#import "PSTCKToken.h" +#import "PSTCKCard.h" + +@interface PSTCKTokenTest : XCTestCase +@end + +@implementation PSTCKTokenTest + +- (NSDictionary *)buildTestTokenResponse { + NSDictionary *tokenDict = @{ @"token": @"pstk_3uohiu3", @"message": @"Success", @"status": @1, @"created": @1353025450.0, @"last4": @"1234" }; + return tokenDict; +} + +- (void)testCreatingTokenWithAttributeDictionarySetsAttributes { + PSTCKToken *token = [PSTCKToken decodedObjectFromAPIResponse:[self buildTestTokenResponse]]; + XCTAssertEqualObjects([token tokenId], @"pstk_3uohiu3", @"Generated token has the correct id"); +// XCTAssertEqual([token livemode], NO, @"Generated token has the correct livemode"); + +// XCTAssertEqualWithAccuracy([[token created] timeIntervalSince1970], 1353025450.0, 1.0, @"Generated token has the correct created time"); +} + +- (void)testCreatingTokenSetsAdditionalResponseFields { + NSMutableDictionary *tokenResponse = [[self buildTestTokenResponse] mutableCopy]; + tokenResponse[@"foo"] = @"bar"; + PSTCKToken *token = [PSTCKToken decodedObjectFromAPIResponse:tokenResponse]; + NSDictionary *allResponseFields = token.allResponseFields; + XCTAssertEqualObjects(allResponseFields[@"foo"], @"bar"); + XCTAssertEqualObjects(allResponseFields[@"last4"], @"1234"); + XCTAssertNil(allResponseFields[@"baz"]); +} + +@end diff --git a/Tests/Tests/UIImage+PaystackTest.m b/Tests/Tests/UIImage+PaystackTest.m new file mode 100644 index 0000000..752d23b --- /dev/null +++ b/Tests/Tests/UIImage+PaystackTest.m @@ -0,0 +1,59 @@ +// +// UIImage+PaystackTest.m +// Paystack +// + +#import +#import "UIImage+Paystack.h" + +@interface UIImage_PaystackTest : XCTestCase +@property NSArray *cardBrands; +@end + +@implementation UIImage_PaystackTest + +- (void)setUp { + self.cardBrands = @[ + @(PSTCKCardBrandAmex), + @(PSTCKCardBrandDinersClub), + @(PSTCKCardBrandDiscover), + @(PSTCKCardBrandJCB), + @(PSTCKCardBrandMasterCard), + @(PSTCKCardBrandUnknown), + @(PSTCKCardBrandVisa), + ]; +} + +- (void)testCardIconMethods { + UIImage *image = nil; + image = [UIImage pstck_amexCardImage]; + XCTAssertNotNil(image); + image = [UIImage pstck_dinersClubCardImage]; + XCTAssertNotNil(image); + image = [UIImage pstck_discoverCardImage]; + XCTAssertNotNil(image); + image = [UIImage pstck_jcbCardImage]; + XCTAssertNotNil(image); + image = [UIImage pstck_masterCardCardImage]; + XCTAssertNotNil(image); + image = [UIImage pstck_visaCardImage]; + XCTAssertNotNil(image); + image = [UIImage pstck_unknownCardCardImage]; + XCTAssertNotNil(image); +} + +- (void)testBrandImageForCardBrand { + for (NSNumber *brand in self.cardBrands) { + UIImage *image = [UIImage pstck_brandImageForCardBrand:[brand integerValue]]; + XCTAssertNotNil(image); + } +} + +- (void)testCVCImageForCardBrand { + for (NSNumber *brand in self.cardBrands) { + UIImage *image = [UIImage pstck_cvcImageForCardBrand:[brand integerValue]]; + XCTAssertNotNil(image); + } +} + +@end diff --git a/Tests/iOS Tests/Info.plist b/Tests/iOS Tests/Info.plist new file mode 100644 index 0000000..c51de42 --- /dev/null +++ b/Tests/iOS Tests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.paystack.Paystack-iOS-Tests + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Tests/installation_tests/carthage/CarthageTest.xcodeproj/project.pbxproj b/Tests/installation_tests/carthage/CarthageTest.xcodeproj/project.pbxproj new file mode 100644 index 0000000..f929a8b --- /dev/null +++ b/Tests/installation_tests/carthage/CarthageTest.xcodeproj/project.pbxproj @@ -0,0 +1,439 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 04E6FCE71B714AC2000C8759 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04E6FCE61B714AC2000C8759 /* AppDelegate.swift */; }; + 04E6FCE91B714AC2000C8759 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04E6FCE81B714AC2000C8759 /* ViewController.swift */; }; + 04E6FCEC1B714AC2000C8759 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 04E6FCEA1B714AC2000C8759 /* Main.storyboard */; }; + 04E6FCEE1B714AC2000C8759 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 04E6FCED1B714AC2000C8759 /* Images.xcassets */; }; + 04E6FCF11B714AC2000C8759 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 04E6FCEF1B714AC2000C8759 /* LaunchScreen.xib */; }; + 04E6FCFD1B714AC2000C8759 /* CarthageTestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04E6FCFC1B714AC2000C8759 /* CarthageTestTests.swift */; }; + 04E6FD071B714DDF000C8759 /* Stripe.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 04E6FD061B714DDF000C8759 /* Stripe.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 04E6FCF71B714AC2000C8759 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 04E6FCD91B714AC2000C8759 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 04E6FCE01B714AC2000C8759; + remoteInfo = CarthageTest; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 04E6FCE11B714AC2000C8759 /* CarthageTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CarthageTest.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 04E6FCE51B714AC2000C8759 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 04E6FCE61B714AC2000C8759 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 04E6FCE81B714AC2000C8759 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 04E6FCEB1B714AC2000C8759 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 04E6FCED1B714AC2000C8759 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 04E6FCF01B714AC2000C8759 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; + 04E6FCF61B714AC2000C8759 /* CarthageTestTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CarthageTestTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 04E6FCFB1B714AC2000C8759 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 04E6FCFC1B714AC2000C8759 /* CarthageTestTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CarthageTestTests.swift; sourceTree = ""; }; + 04E6FD061B714DDF000C8759 /* Stripe.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Stripe.framework; path = Carthage/Build/iOS/Stripe.framework; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 04E6FCDE1B714AC2000C8759 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 04E6FD071B714DDF000C8759 /* Stripe.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04E6FCF31B714AC2000C8759 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 04E6FCD81B714AC2000C8759 = { + isa = PBXGroup; + children = ( + 04E6FD061B714DDF000C8759 /* Stripe.framework */, + 04E6FCE31B714AC2000C8759 /* CarthageTest */, + 04E6FCF91B714AC2000C8759 /* CarthageTestTests */, + 04E6FCE21B714AC2000C8759 /* Products */, + ); + sourceTree = ""; + }; + 04E6FCE21B714AC2000C8759 /* Products */ = { + isa = PBXGroup; + children = ( + 04E6FCE11B714AC2000C8759 /* CarthageTest.app */, + 04E6FCF61B714AC2000C8759 /* CarthageTestTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 04E6FCE31B714AC2000C8759 /* CarthageTest */ = { + isa = PBXGroup; + children = ( + 04E6FCE61B714AC2000C8759 /* AppDelegate.swift */, + 04E6FCE81B714AC2000C8759 /* ViewController.swift */, + 04E6FCEA1B714AC2000C8759 /* Main.storyboard */, + 04E6FCED1B714AC2000C8759 /* Images.xcassets */, + 04E6FCEF1B714AC2000C8759 /* LaunchScreen.xib */, + 04E6FCE41B714AC2000C8759 /* Supporting Files */, + ); + path = CarthageTest; + sourceTree = ""; + }; + 04E6FCE41B714AC2000C8759 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 04E6FCE51B714AC2000C8759 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 04E6FCF91B714AC2000C8759 /* CarthageTestTests */ = { + isa = PBXGroup; + children = ( + 04E6FCFC1B714AC2000C8759 /* CarthageTestTests.swift */, + 04E6FCFA1B714AC2000C8759 /* Supporting Files */, + ); + path = CarthageTestTests; + sourceTree = ""; + }; + 04E6FCFA1B714AC2000C8759 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 04E6FCFB1B714AC2000C8759 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 04E6FCE01B714AC2000C8759 /* CarthageTest */ = { + isa = PBXNativeTarget; + buildConfigurationList = 04E6FD001B714AC2000C8759 /* Build configuration list for PBXNativeTarget "CarthageTest" */; + buildPhases = ( + 04E6FCDD1B714AC2000C8759 /* Sources */, + 04E6FCDE1B714AC2000C8759 /* Frameworks */, + 04E6FCDF1B714AC2000C8759 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = CarthageTest; + productName = CarthageTest; + productReference = 04E6FCE11B714AC2000C8759 /* CarthageTest.app */; + productType = "com.apple.product-type.application"; + }; + 04E6FCF51B714AC2000C8759 /* CarthageTestTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 04E6FD031B714AC2000C8759 /* Build configuration list for PBXNativeTarget "CarthageTestTests" */; + buildPhases = ( + 04E6FCF21B714AC2000C8759 /* Sources */, + 04E6FCF31B714AC2000C8759 /* Frameworks */, + 04E6FCF41B714AC2000C8759 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 04E6FCF81B714AC2000C8759 /* PBXTargetDependency */, + ); + name = CarthageTestTests; + productName = CarthageTestTests; + productReference = 04E6FCF61B714AC2000C8759 /* CarthageTestTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 04E6FCD91B714AC2000C8759 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0720; + LastUpgradeCheck = 0640; + ORGANIZATIONNAME = jflinter; + TargetAttributes = { + 04E6FCE01B714AC2000C8759 = { + CreatedOnToolsVersion = 6.4; + }; + 04E6FCF51B714AC2000C8759 = { + CreatedOnToolsVersion = 6.4; + TestTargetID = 04E6FCE01B714AC2000C8759; + }; + }; + }; + buildConfigurationList = 04E6FCDC1B714AC2000C8759 /* Build configuration list for PBXProject "CarthageTest" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 04E6FCD81B714AC2000C8759; + productRefGroup = 04E6FCE21B714AC2000C8759 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 04E6FCE01B714AC2000C8759 /* CarthageTest */, + 04E6FCF51B714AC2000C8759 /* CarthageTestTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 04E6FCDF1B714AC2000C8759 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 04E6FCEC1B714AC2000C8759 /* Main.storyboard in Resources */, + 04E6FCF11B714AC2000C8759 /* LaunchScreen.xib in Resources */, + 04E6FCEE1B714AC2000C8759 /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04E6FCF41B714AC2000C8759 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 04E6FCDD1B714AC2000C8759 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 04E6FCE91B714AC2000C8759 /* ViewController.swift in Sources */, + 04E6FCE71B714AC2000C8759 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04E6FCF21B714AC2000C8759 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 04E6FCFD1B714AC2000C8759 /* CarthageTestTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 04E6FCF81B714AC2000C8759 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 04E6FCE01B714AC2000C8759 /* CarthageTest */; + targetProxy = 04E6FCF71B714AC2000C8759 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 04E6FCEA1B714AC2000C8759 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 04E6FCEB1B714AC2000C8759 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 04E6FCEF1B714AC2000C8759 /* LaunchScreen.xib */ = { + isa = PBXVariantGroup; + children = ( + 04E6FCF01B714AC2000C8759 /* Base */, + ); + name = LaunchScreen.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 04E6FCFE1B714AC2000C8759 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.4; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 04E6FCFF1B714AC2000C8759 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.4; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 04E6FD011B714AC2000C8759 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = CarthageTest/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 04E6FD021B714AC2000C8759 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/Carthage/Build/iOS", + ); + INFOPLIST_FILE = CarthageTest/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 04E6FD041B714AC2000C8759 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = CarthageTestTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CarthageTest.app/CarthageTest"; + }; + name = Debug; + }; + 04E6FD051B714AC2000C8759 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + INFOPLIST_FILE = CarthageTestTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CarthageTest.app/CarthageTest"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 04E6FCDC1B714AC2000C8759 /* Build configuration list for PBXProject "CarthageTest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 04E6FCFE1B714AC2000C8759 /* Debug */, + 04E6FCFF1B714AC2000C8759 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 04E6FD001B714AC2000C8759 /* Build configuration list for PBXNativeTarget "CarthageTest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 04E6FD011B714AC2000C8759 /* Debug */, + 04E6FD021B714AC2000C8759 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 04E6FD031B714AC2000C8759 /* Build configuration list for PBXNativeTarget "CarthageTestTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 04E6FD041B714AC2000C8759 /* Debug */, + 04E6FD051B714AC2000C8759 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 04E6FCD91B714AC2000C8759 /* Project object */; +} diff --git a/Tests/installation_tests/carthage/CarthageTest.xcodeproj/xcshareddata/xcschemes/CarthageTest.xcscheme b/Tests/installation_tests/carthage/CarthageTest.xcodeproj/xcshareddata/xcschemes/CarthageTest.xcscheme new file mode 100644 index 0000000..7e24553 --- /dev/null +++ b/Tests/installation_tests/carthage/CarthageTest.xcodeproj/xcshareddata/xcschemes/CarthageTest.xcscheme @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/installation_tests/carthage/CarthageTest/AppDelegate.swift b/Tests/installation_tests/carthage/CarthageTest/AppDelegate.swift new file mode 100644 index 0000000..573d68b --- /dev/null +++ b/Tests/installation_tests/carthage/CarthageTest/AppDelegate.swift @@ -0,0 +1,43 @@ +// +// AppDelegate.swift +// CarthageTest +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(application: UIApplication) { + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/Tests/installation_tests/carthage/CarthageTest/Base.lproj/LaunchScreen.xib b/Tests/installation_tests/carthage/CarthageTest/Base.lproj/LaunchScreen.xib new file mode 100644 index 0000000..42b66f4 --- /dev/null +++ b/Tests/installation_tests/carthage/CarthageTest/Base.lproj/LaunchScreen.xib @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/installation_tests/carthage/CarthageTest/Base.lproj/Main.storyboard b/Tests/installation_tests/carthage/CarthageTest/Base.lproj/Main.storyboard new file mode 100644 index 0000000..52ea29e --- /dev/null +++ b/Tests/installation_tests/carthage/CarthageTest/Base.lproj/Main.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/installation_tests/carthage/CarthageTest/Images.xcassets/AppIcon.appiconset/Contents.json b/Tests/installation_tests/carthage/CarthageTest/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..118c98f --- /dev/null +++ b/Tests/installation_tests/carthage/CarthageTest/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,38 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Tests/installation_tests/carthage/CarthageTest/Info.plist b/Tests/installation_tests/carthage/CarthageTest/Info.plist new file mode 100644 index 0000000..6eb6c75 --- /dev/null +++ b/Tests/installation_tests/carthage/CarthageTest/Info.plist @@ -0,0 +1,40 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.jflinter.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Tests/installation_tests/carthage/CarthageTest/ViewController.swift b/Tests/installation_tests/carthage/CarthageTest/ViewController.swift new file mode 100644 index 0000000..c8d2f12 --- /dev/null +++ b/Tests/installation_tests/carthage/CarthageTest/ViewController.swift @@ -0,0 +1,25 @@ +// +// ViewController.swift +// CarthageTest +// + +import UIKit +import Paystack + +class ViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + Paystack.setDefaultPublishableKey("test") + Paystack.paymentRequestWithMerchantIdentifier("test") + // Do any additional setup after loading the view, typically from a nib. + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + +} + diff --git a/Tests/installation_tests/carthage/CarthageTestTests/CarthageTestTests.swift b/Tests/installation_tests/carthage/CarthageTestTests/CarthageTestTests.swift new file mode 100644 index 0000000..a87b688 --- /dev/null +++ b/Tests/installation_tests/carthage/CarthageTestTests/CarthageTestTests.swift @@ -0,0 +1,33 @@ +// +// CarthageTestTests.swift +// CarthageTestTests +// + +import UIKit +import XCTest + +class CarthageTestTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + XCTAssert(true, "Pass") + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measureBlock() { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/Tests/installation_tests/carthage/CarthageTestTests/Info.plist b/Tests/installation_tests/carthage/CarthageTestTests/Info.plist new file mode 100644 index 0000000..7330e97 --- /dev/null +++ b/Tests/installation_tests/carthage/CarthageTestTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.jflinter.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Tests/installation_tests/carthage/test.sh b/Tests/installation_tests/carthage/test.sh new file mode 100755 index 0000000..182cc06 --- /dev/null +++ b/Tests/installation_tests/carthage/test.sh @@ -0,0 +1,19 @@ +#!/bin/sh + +echo "Checking test Carthage app (with frameworks)..." + +TESTDIR="$(cd $(dirname $0); pwd)" +echo $TESTDIR +cd $TESTDIR + +GIT_REPO=`cd "../../.."; pwd` +cd $TESTDIR + +GIT_BRANCH=${TRAVIS_COMMIT-`git branch | sed -n '/\* /s///p'`} + +rm -f "$TESTDIR/Cartfile*" +echo "git \"$GIT_REPO\" \"$GIT_BRANCH\"" > "$TESTDIR/Cartfile" + +carthage update + +xctool build -project "$TESTDIR/CarthageTest.xcodeproj" -scheme CarthageTest -sdk iphonesimulator diff --git a/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest.xcodeproj/project.pbxproj b/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest.xcodeproj/project.pbxproj new file mode 100644 index 0000000..2ced3a6 --- /dev/null +++ b/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest.xcodeproj/project.pbxproj @@ -0,0 +1,503 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 04E6FCB91B714933000C8759 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04E6FCB81B714933000C8759 /* AppDelegate.swift */; }; + 04E6FCBB1B714933000C8759 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04E6FCBA1B714933000C8759 /* ViewController.swift */; }; + 04E6FCBE1B714933000C8759 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 04E6FCBC1B714933000C8759 /* Main.storyboard */; }; + 04E6FCC01B714933000C8759 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 04E6FCBF1B714933000C8759 /* Images.xcassets */; }; + 04E6FCC31B714933000C8759 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 04E6FCC11B714933000C8759 /* LaunchScreen.xib */; }; + 04E6FCCF1B714933000C8759 /* CocoapodsTestTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04E6FCCE1B714933000C8759 /* CocoapodsTestTests.swift */; }; + 9F0064E2A2DB6EB40DBC6336 /* Pods.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2C012B7D3F96E621477F0C65 /* Pods.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 04E6FCC91B714933000C8759 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 04E6FCAB1B714933000C8759 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 04E6FCB21B714933000C8759; + remoteInfo = CocoapodsTest; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 04E6FCB31B714933000C8759 /* CocoapodsTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CocoapodsTest.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 04E6FCB71B714933000C8759 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 04E6FCB81B714933000C8759 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 04E6FCBA1B714933000C8759 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 04E6FCBD1B714933000C8759 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 04E6FCBF1B714933000C8759 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 04E6FCC21B714933000C8759 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; + 04E6FCC81B714933000C8759 /* CocoapodsTestTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CocoapodsTestTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 04E6FCCD1B714933000C8759 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 04E6FCCE1B714933000C8759 /* CocoapodsTestTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CocoapodsTestTests.swift; sourceTree = ""; }; + 2C012B7D3F96E621477F0C65 /* Pods.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 53B680CE7571984EBB7BBDF9 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; + AB71FF4355BF512D380B3DC0 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 04E6FCB01B714933000C8759 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 9F0064E2A2DB6EB40DBC6336 /* Pods.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04E6FCC51B714933000C8759 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 04E6FCAA1B714933000C8759 = { + isa = PBXGroup; + children = ( + 04E6FCB51B714933000C8759 /* CocoapodsTest */, + 04E6FCCB1B714933000C8759 /* CocoapodsTestTests */, + 04E6FCB41B714933000C8759 /* Products */, + B866CA45F2ADDD7508957EA3 /* Pods */, + F9BDE2672C6EFAED4A918CA1 /* Frameworks */, + ); + sourceTree = ""; + }; + 04E6FCB41B714933000C8759 /* Products */ = { + isa = PBXGroup; + children = ( + 04E6FCB31B714933000C8759 /* CocoapodsTest.app */, + 04E6FCC81B714933000C8759 /* CocoapodsTestTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 04E6FCB51B714933000C8759 /* CocoapodsTest */ = { + isa = PBXGroup; + children = ( + 04E6FCB81B714933000C8759 /* AppDelegate.swift */, + 04E6FCBA1B714933000C8759 /* ViewController.swift */, + 04E6FCBC1B714933000C8759 /* Main.storyboard */, + 04E6FCBF1B714933000C8759 /* Images.xcassets */, + 04E6FCC11B714933000C8759 /* LaunchScreen.xib */, + 04E6FCB61B714933000C8759 /* Supporting Files */, + ); + path = CocoapodsTest; + sourceTree = ""; + }; + 04E6FCB61B714933000C8759 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 04E6FCB71B714933000C8759 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 04E6FCCB1B714933000C8759 /* CocoapodsTestTests */ = { + isa = PBXGroup; + children = ( + 04E6FCCE1B714933000C8759 /* CocoapodsTestTests.swift */, + 04E6FCCC1B714933000C8759 /* Supporting Files */, + ); + path = CocoapodsTestTests; + sourceTree = ""; + }; + 04E6FCCC1B714933000C8759 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 04E6FCCD1B714933000C8759 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + B866CA45F2ADDD7508957EA3 /* Pods */ = { + isa = PBXGroup; + children = ( + 53B680CE7571984EBB7BBDF9 /* Pods.debug.xcconfig */, + AB71FF4355BF512D380B3DC0 /* Pods.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; + F9BDE2672C6EFAED4A918CA1 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 2C012B7D3F96E621477F0C65 /* Pods.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 04E6FCB21B714933000C8759 /* CocoapodsTest */ = { + isa = PBXNativeTarget; + buildConfigurationList = 04E6FCD21B714933000C8759 /* Build configuration list for PBXNativeTarget "CocoapodsTest" */; + buildPhases = ( + 50BA6C4AD2FD230C6E80F028 /* Check Pods Manifest.lock */, + 04E6FCAF1B714933000C8759 /* Sources */, + 04E6FCB01B714933000C8759 /* Frameworks */, + 04E6FCB11B714933000C8759 /* Resources */, + E76E35A1E013E33626CFDCFE /* Embed Pods Frameworks */, + FB5604FF79E0AD66B96A873C /* Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = CocoapodsTest; + productName = CocoapodsTest; + productReference = 04E6FCB31B714933000C8759 /* CocoapodsTest.app */; + productType = "com.apple.product-type.application"; + }; + 04E6FCC71B714933000C8759 /* CocoapodsTestTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 04E6FCD51B714933000C8759 /* Build configuration list for PBXNativeTarget "CocoapodsTestTests" */; + buildPhases = ( + 04E6FCC41B714933000C8759 /* Sources */, + 04E6FCC51B714933000C8759 /* Frameworks */, + 04E6FCC61B714933000C8759 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 04E6FCCA1B714933000C8759 /* PBXTargetDependency */, + ); + name = CocoapodsTestTests; + productName = CocoapodsTestTests; + productReference = 04E6FCC81B714933000C8759 /* CocoapodsTestTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 04E6FCAB1B714933000C8759 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0640; + ORGANIZATIONNAME = jflinter; + TargetAttributes = { + 04E6FCB21B714933000C8759 = { + CreatedOnToolsVersion = 6.4; + }; + 04E6FCC71B714933000C8759 = { + CreatedOnToolsVersion = 6.4; + TestTargetID = 04E6FCB21B714933000C8759; + }; + }; + }; + buildConfigurationList = 04E6FCAE1B714933000C8759 /* Build configuration list for PBXProject "CocoapodsTest" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 04E6FCAA1B714933000C8759; + productRefGroup = 04E6FCB41B714933000C8759 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 04E6FCB21B714933000C8759 /* CocoapodsTest */, + 04E6FCC71B714933000C8759 /* CocoapodsTestTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 04E6FCB11B714933000C8759 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 04E6FCBE1B714933000C8759 /* Main.storyboard in Resources */, + 04E6FCC31B714933000C8759 /* LaunchScreen.xib in Resources */, + 04E6FCC01B714933000C8759 /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04E6FCC61B714933000C8759 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 50BA6C4AD2FD230C6E80F028 /* Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; + E76E35A1E013E33626CFDCFE /* Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + FB5604FF79E0AD66B96A873C /* Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 04E6FCAF1B714933000C8759 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 04E6FCBB1B714933000C8759 /* ViewController.swift in Sources */, + 04E6FCB91B714933000C8759 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04E6FCC41B714933000C8759 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 04E6FCCF1B714933000C8759 /* CocoapodsTestTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 04E6FCCA1B714933000C8759 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 04E6FCB21B714933000C8759 /* CocoapodsTest */; + targetProxy = 04E6FCC91B714933000C8759 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 04E6FCBC1B714933000C8759 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 04E6FCBD1B714933000C8759 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 04E6FCC11B714933000C8759 /* LaunchScreen.xib */ = { + isa = PBXVariantGroup; + children = ( + 04E6FCC21B714933000C8759 /* Base */, + ); + name = LaunchScreen.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 04E6FCD01B714933000C8759 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.4; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 04E6FCD11B714933000C8759 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.4; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 04E6FCD31B714933000C8759 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 53B680CE7571984EBB7BBDF9 /* Pods.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = CocoapodsTest/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 04E6FCD41B714933000C8759 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AB71FF4355BF512D380B3DC0 /* Pods.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = CocoapodsTest/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 04E6FCD61B714933000C8759 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = CocoapodsTestTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CocoapodsTest.app/CocoapodsTest"; + }; + name = Debug; + }; + 04E6FCD71B714933000C8759 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + INFOPLIST_FILE = CocoapodsTestTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CocoapodsTest.app/CocoapodsTest"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 04E6FCAE1B714933000C8759 /* Build configuration list for PBXProject "CocoapodsTest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 04E6FCD01B714933000C8759 /* Debug */, + 04E6FCD11B714933000C8759 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 04E6FCD21B714933000C8759 /* Build configuration list for PBXNativeTarget "CocoapodsTest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 04E6FCD31B714933000C8759 /* Debug */, + 04E6FCD41B714933000C8759 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 04E6FCD51B714933000C8759 /* Build configuration list for PBXNativeTarget "CocoapodsTestTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 04E6FCD61B714933000C8759 /* Debug */, + 04E6FCD71B714933000C8759 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 04E6FCAB1B714933000C8759 /* Project object */; +} diff --git a/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest.xcodeproj/xcshareddata/xcschemes/CocoapodsTest.xcscheme b/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest.xcodeproj/xcshareddata/xcschemes/CocoapodsTest.xcscheme new file mode 100644 index 0000000..9497123 --- /dev/null +++ b/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest.xcodeproj/xcshareddata/xcschemes/CocoapodsTest.xcscheme @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest.xcworkspace/contents.xcworkspacedata b/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..f13fd1d --- /dev/null +++ b/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest.xcworkspace/xcshareddata/CocoapodsTest.xccheckout b/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest.xcworkspace/xcshareddata/CocoapodsTest.xccheckout new file mode 100644 index 0000000..c001da6 --- /dev/null +++ b/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest.xcworkspace/xcshareddata/CocoapodsTest.xccheckout @@ -0,0 +1,41 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + A59515FF-C773-43C0-8586-3E2283D58A47 + IDESourceControlProjectName + CocoapodsTest + IDESourceControlProjectOriginsDictionary + + A5C151FC3F18980DA2906AAA3DE9140767EF2310 + github.com:stripe/stripe-ios.git + + IDESourceControlProjectPath + Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest.xcworkspace + IDESourceControlProjectRelativeInstallPathDictionary + + A5C151FC3F18980DA2906AAA3DE9140767EF2310 + ../../../../.. + + IDESourceControlProjectURL + github.com:stripe/stripe-ios.git + IDESourceControlProjectVersion + 111 + IDESourceControlProjectWCCIdentifier + A5C151FC3F18980DA2906AAA3DE9140767EF2310 + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + A5C151FC3F18980DA2906AAA3DE9140767EF2310 + IDESourceControlWCCName + stripe-ios + + + + diff --git a/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest/AppDelegate.swift b/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest/AppDelegate.swift new file mode 100644 index 0000000..4a6cc6c --- /dev/null +++ b/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest/AppDelegate.swift @@ -0,0 +1,43 @@ +// +// AppDelegate.swift +// CocoapodsTest +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(application: UIApplication) { + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest/Base.lproj/LaunchScreen.xib b/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest/Base.lproj/LaunchScreen.xib new file mode 100644 index 0000000..785b114 --- /dev/null +++ b/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest/Base.lproj/LaunchScreen.xib @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest/Base.lproj/Main.storyboard b/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest/Base.lproj/Main.storyboard new file mode 100644 index 0000000..52ea29e --- /dev/null +++ b/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest/Base.lproj/Main.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest/Images.xcassets/AppIcon.appiconset/Contents.json b/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..118c98f --- /dev/null +++ b/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,38 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest/Info.plist b/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest/Info.plist new file mode 100644 index 0000000..6eb6c75 --- /dev/null +++ b/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest/Info.plist @@ -0,0 +1,40 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.jflinter.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest/ViewController.swift b/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest/ViewController.swift new file mode 100644 index 0000000..9b5bcaf --- /dev/null +++ b/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTest/ViewController.swift @@ -0,0 +1,24 @@ +// +// ViewController.swift +// CocoapodsTest +// + +import UIKit +import Paystack + +class ViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + Paystack.setDefaultPublishableKey("test") + // Do any additional setup after loading the view, typically from a nib. + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + +} + diff --git a/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTestTests/CocoapodsTestTests.swift b/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTestTests/CocoapodsTestTests.swift new file mode 100644 index 0000000..125e393 --- /dev/null +++ b/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTestTests/CocoapodsTestTests.swift @@ -0,0 +1,33 @@ +// +// CocoapodsTestTests.swift +// CocoapodsTestTests +// + +import UIKit +import XCTest + +class CocoapodsTestTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + XCTAssert(true, "Pass") + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measureBlock() { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTestTests/Info.plist b/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTestTests/Info.plist new file mode 100644 index 0000000..7330e97 --- /dev/null +++ b/Tests/installation_tests/cocoapods/with_frameworks/CocoapodsTestTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.jflinter.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Tests/installation_tests/cocoapods/with_frameworks/Podfile b/Tests/installation_tests/cocoapods/with_frameworks/Podfile new file mode 100644 index 0000000..06f9a11 --- /dev/null +++ b/Tests/installation_tests/cocoapods/with_frameworks/Podfile @@ -0,0 +1,3 @@ +use_frameworks! +pod 'Paystack', path: '../../../..' +pod 'Paystack/ApplePay', path: '../../../..' diff --git a/Tests/installation_tests/cocoapods/with_frameworks/test.sh b/Tests/installation_tests/cocoapods/with_frameworks/test.sh new file mode 100755 index 0000000..f64575e --- /dev/null +++ b/Tests/installation_tests/cocoapods/with_frameworks/test.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +echo "Checking test CocoaPods app (with frameworks)..." +cd $(dirname $0) + +rm -rf Pods +rm -f Podfile.lock +pod install --no-repo-update && xctool build -workspace CocoapodsTest.xcworkspace -scheme CocoapodsTest -sdk iphonesimulator diff --git a/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest.xcodeproj/project.pbxproj b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest.xcodeproj/project.pbxproj new file mode 100644 index 0000000..57e5f35 --- /dev/null +++ b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest.xcodeproj/project.pbxproj @@ -0,0 +1,512 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 04E6FC871B71486C000C8759 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 04E6FC861B71486C000C8759 /* main.m */; }; + 04E6FC8A1B71486C000C8759 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 04E6FC891B71486C000C8759 /* AppDelegate.m */; }; + 04E6FC8D1B71486C000C8759 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 04E6FC8C1B71486C000C8759 /* ViewController.m */; }; + 04E6FC901B71486C000C8759 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 04E6FC8E1B71486C000C8759 /* Main.storyboard */; }; + 04E6FC921B71486C000C8759 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 04E6FC911B71486C000C8759 /* Images.xcassets */; }; + 04E6FC951B71486C000C8759 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 04E6FC931B71486C000C8759 /* LaunchScreen.xib */; }; + 04E6FCA11B71486C000C8759 /* CocoapodsTestTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 04E6FCA01B71486C000C8759 /* CocoapodsTestTests.m */; }; + 4E8308ACD5BBB11A999A6A70 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 0DD2F1421E8E18D88413F41D /* libPods.a */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 04E6FC9B1B71486C000C8759 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 04E6FC791B71486C000C8759 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 04E6FC801B71486C000C8759; + remoteInfo = CocoapodsTest; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 04E6FC811B71486C000C8759 /* CocoapodsTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CocoapodsTest.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 04E6FC851B71486C000C8759 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 04E6FC861B71486C000C8759 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 04E6FC881B71486C000C8759 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 04E6FC891B71486C000C8759 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 04E6FC8B1B71486C000C8759 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; + 04E6FC8C1B71486C000C8759 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; + 04E6FC8F1B71486C000C8759 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 04E6FC911B71486C000C8759 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 04E6FC941B71486C000C8759 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; + 04E6FC9A1B71486C000C8759 /* CocoapodsTestTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = CocoapodsTestTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 04E6FC9F1B71486C000C8759 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 04E6FCA01B71486C000C8759 /* CocoapodsTestTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CocoapodsTestTests.m; sourceTree = ""; }; + 0DD2F1421E8E18D88413F41D /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 0E0B74F616ACCC74DB5944F8 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; + EC76E70B1A776CAA19E46F17 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 04E6FC7E1B71486C000C8759 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 4E8308ACD5BBB11A999A6A70 /* libPods.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04E6FC971B71486C000C8759 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 04E6FC781B71486C000C8759 = { + isa = PBXGroup; + children = ( + 04E6FC831B71486C000C8759 /* CocoapodsTest */, + 04E6FC9D1B71486C000C8759 /* CocoapodsTestTests */, + 04E6FC821B71486C000C8759 /* Products */, + 7829CF0613338925F3341315 /* Pods */, + E5103E8A1FC3F803F52E2E05 /* Frameworks */, + ); + sourceTree = ""; + }; + 04E6FC821B71486C000C8759 /* Products */ = { + isa = PBXGroup; + children = ( + 04E6FC811B71486C000C8759 /* CocoapodsTest.app */, + 04E6FC9A1B71486C000C8759 /* CocoapodsTestTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 04E6FC831B71486C000C8759 /* CocoapodsTest */ = { + isa = PBXGroup; + children = ( + 04E6FC881B71486C000C8759 /* AppDelegate.h */, + 04E6FC891B71486C000C8759 /* AppDelegate.m */, + 04E6FC8B1B71486C000C8759 /* ViewController.h */, + 04E6FC8C1B71486C000C8759 /* ViewController.m */, + 04E6FC8E1B71486C000C8759 /* Main.storyboard */, + 04E6FC911B71486C000C8759 /* Images.xcassets */, + 04E6FC931B71486C000C8759 /* LaunchScreen.xib */, + 04E6FC841B71486C000C8759 /* Supporting Files */, + ); + path = CocoapodsTest; + sourceTree = ""; + }; + 04E6FC841B71486C000C8759 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 04E6FC851B71486C000C8759 /* Info.plist */, + 04E6FC861B71486C000C8759 /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 04E6FC9D1B71486C000C8759 /* CocoapodsTestTests */ = { + isa = PBXGroup; + children = ( + 04E6FCA01B71486C000C8759 /* CocoapodsTestTests.m */, + 04E6FC9E1B71486C000C8759 /* Supporting Files */, + ); + path = CocoapodsTestTests; + sourceTree = ""; + }; + 04E6FC9E1B71486C000C8759 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 04E6FC9F1B71486C000C8759 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 7829CF0613338925F3341315 /* Pods */ = { + isa = PBXGroup; + children = ( + EC76E70B1A776CAA19E46F17 /* Pods.debug.xcconfig */, + 0E0B74F616ACCC74DB5944F8 /* Pods.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; + E5103E8A1FC3F803F52E2E05 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 0DD2F1421E8E18D88413F41D /* libPods.a */, + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 04E6FC801B71486C000C8759 /* CocoapodsTest */ = { + isa = PBXNativeTarget; + buildConfigurationList = 04E6FCA41B71486C000C8759 /* Build configuration list for PBXNativeTarget "CocoapodsTest" */; + buildPhases = ( + 7E106CBCE9C93E56E8330C33 /* Check Pods Manifest.lock */, + 04E6FC7D1B71486C000C8759 /* Sources */, + 04E6FC7E1B71486C000C8759 /* Frameworks */, + 04E6FC7F1B71486C000C8759 /* Resources */, + B2A9D9F6678A1B4817096B70 /* Copy Pods Resources */, + 06C725CF87BC61F53076066A /* Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = CocoapodsTest; + productName = CocoapodsTest; + productReference = 04E6FC811B71486C000C8759 /* CocoapodsTest.app */; + productType = "com.apple.product-type.application"; + }; + 04E6FC991B71486C000C8759 /* CocoapodsTestTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 04E6FCA71B71486C000C8759 /* Build configuration list for PBXNativeTarget "CocoapodsTestTests" */; + buildPhases = ( + 04E6FC961B71486C000C8759 /* Sources */, + 04E6FC971B71486C000C8759 /* Frameworks */, + 04E6FC981B71486C000C8759 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 04E6FC9C1B71486C000C8759 /* PBXTargetDependency */, + ); + name = CocoapodsTestTests; + productName = CocoapodsTestTests; + productReference = 04E6FC9A1B71486C000C8759 /* CocoapodsTestTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 04E6FC791B71486C000C8759 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0640; + ORGANIZATIONNAME = jflinter; + TargetAttributes = { + 04E6FC801B71486C000C8759 = { + CreatedOnToolsVersion = 6.4; + }; + 04E6FC991B71486C000C8759 = { + CreatedOnToolsVersion = 6.4; + TestTargetID = 04E6FC801B71486C000C8759; + }; + }; + }; + buildConfigurationList = 04E6FC7C1B71486C000C8759 /* Build configuration list for PBXProject "CocoapodsTest" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 04E6FC781B71486C000C8759; + productRefGroup = 04E6FC821B71486C000C8759 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 04E6FC801B71486C000C8759 /* CocoapodsTest */, + 04E6FC991B71486C000C8759 /* CocoapodsTestTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 04E6FC7F1B71486C000C8759 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 04E6FC901B71486C000C8759 /* Main.storyboard in Resources */, + 04E6FC951B71486C000C8759 /* LaunchScreen.xib in Resources */, + 04E6FC921B71486C000C8759 /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04E6FC981B71486C000C8759 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 06C725CF87BC61F53076066A /* Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 7E106CBCE9C93E56E8330C33 /* Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; + B2A9D9F6678A1B4817096B70 /* Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 04E6FC7D1B71486C000C8759 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 04E6FC8D1B71486C000C8759 /* ViewController.m in Sources */, + 04E6FC8A1B71486C000C8759 /* AppDelegate.m in Sources */, + 04E6FC871B71486C000C8759 /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 04E6FC961B71486C000C8759 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 04E6FCA11B71486C000C8759 /* CocoapodsTestTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 04E6FC9C1B71486C000C8759 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 04E6FC801B71486C000C8759 /* CocoapodsTest */; + targetProxy = 04E6FC9B1B71486C000C8759 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 04E6FC8E1B71486C000C8759 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 04E6FC8F1B71486C000C8759 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 04E6FC931B71486C000C8759 /* LaunchScreen.xib */ = { + isa = PBXVariantGroup; + children = ( + 04E6FC941B71486C000C8759 /* Base */, + ); + name = LaunchScreen.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 04E6FCA21B71486C000C8759 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.4; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 04E6FCA31B71486C000C8759 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.4; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 04E6FCA51B71486C000C8759 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = EC76E70B1A776CAA19E46F17 /* Pods.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = CocoapodsTest/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 04E6FCA61B71486C000C8759 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 0E0B74F616ACCC74DB5944F8 /* Pods.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = CocoapodsTest/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 04E6FCA81B71486C000C8759 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = CocoapodsTestTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CocoapodsTest.app/CocoapodsTest"; + }; + name = Debug; + }; + 04E6FCA91B71486C000C8759 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + INFOPLIST_FILE = CocoapodsTestTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/CocoapodsTest.app/CocoapodsTest"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 04E6FC7C1B71486C000C8759 /* Build configuration list for PBXProject "CocoapodsTest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 04E6FCA21B71486C000C8759 /* Debug */, + 04E6FCA31B71486C000C8759 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 04E6FCA41B71486C000C8759 /* Build configuration list for PBXNativeTarget "CocoapodsTest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 04E6FCA51B71486C000C8759 /* Debug */, + 04E6FCA61B71486C000C8759 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 04E6FCA71B71486C000C8759 /* Build configuration list for PBXNativeTarget "CocoapodsTestTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 04E6FCA81B71486C000C8759 /* Debug */, + 04E6FCA91B71486C000C8759 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 04E6FC791B71486C000C8759 /* Project object */; +} diff --git a/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest.xcodeproj/xcshareddata/xcschemes/CocoapodsTest.xcscheme b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest.xcodeproj/xcshareddata/xcschemes/CocoapodsTest.xcscheme new file mode 100644 index 0000000..a56168a --- /dev/null +++ b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest.xcodeproj/xcshareddata/xcschemes/CocoapodsTest.xcscheme @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest.xcworkspace/contents.xcworkspacedata b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..f13fd1d --- /dev/null +++ b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest.xcworkspace/xcshareddata/CocoapodsTest.xccheckout b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest.xcworkspace/xcshareddata/CocoapodsTest.xccheckout new file mode 100644 index 0000000..3d5dc9a --- /dev/null +++ b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest.xcworkspace/xcshareddata/CocoapodsTest.xccheckout @@ -0,0 +1,41 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + 87497C4A-207C-450D-9984-C8AD185AFD7D + IDESourceControlProjectName + CocoapodsTest + IDESourceControlProjectOriginsDictionary + + A5C151FC3F18980DA2906AAA3DE9140767EF2310 + github.com:stripe/stripe-ios.git + + IDESourceControlProjectPath + Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest.xcworkspace + IDESourceControlProjectRelativeInstallPathDictionary + + A5C151FC3F18980DA2906AAA3DE9140767EF2310 + ../../../../.. + + IDESourceControlProjectURL + github.com:stripe/stripe-ios.git + IDESourceControlProjectVersion + 111 + IDESourceControlProjectWCCIdentifier + A5C151FC3F18980DA2906AAA3DE9140767EF2310 + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + A5C151FC3F18980DA2906AAA3DE9140767EF2310 + IDESourceControlWCCName + stripe-ios + + + + diff --git a/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/AppDelegate.h b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/AppDelegate.h new file mode 100644 index 0000000..c1c33ea --- /dev/null +++ b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/AppDelegate.h @@ -0,0 +1,14 @@ +// +// AppDelegate.h +// CocoapodsTest +// + +#import + +@interface AppDelegate : UIResponder + +@property (strong, nonatomic) UIWindow *window; + + +@end + diff --git a/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/AppDelegate.m b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/AppDelegate.m new file mode 100644 index 0000000..2a5c123 --- /dev/null +++ b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/AppDelegate.m @@ -0,0 +1,42 @@ +// +// AppDelegate.m +// CocoapodsTest +// + +#import "AppDelegate.h" + +@interface AppDelegate () + +@end + +@implementation AppDelegate + + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + // Override point for customization after application launch. + return YES; +} + +- (void)applicationWillResignActive:(UIApplication *)application { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. +} + +- (void)applicationDidEnterBackground:(UIApplication *)application { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. +} + +- (void)applicationWillEnterForeground:(UIApplication *)application { + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. +} + +- (void)applicationDidBecomeActive:(UIApplication *)application { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. +} + +- (void)applicationWillTerminate:(UIApplication *)application { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. +} + +@end diff --git a/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/Base.lproj/LaunchScreen.xib b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/Base.lproj/LaunchScreen.xib new file mode 100644 index 0000000..785b114 --- /dev/null +++ b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/Base.lproj/LaunchScreen.xib @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/Base.lproj/Main.storyboard b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/Base.lproj/Main.storyboard new file mode 100644 index 0000000..d912f9d --- /dev/null +++ b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/Base.lproj/Main.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/Images.xcassets/AppIcon.appiconset/Contents.json b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..118c98f --- /dev/null +++ b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,38 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/Info.plist b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/Info.plist new file mode 100644 index 0000000..6eb6c75 --- /dev/null +++ b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/Info.plist @@ -0,0 +1,40 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.jflinter.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/ViewController.h b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/ViewController.h new file mode 100644 index 0000000..eb73075 --- /dev/null +++ b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/ViewController.h @@ -0,0 +1,12 @@ +// +// ViewController.h +// CocoapodsTest +// + +#import + +@interface ViewController : UIViewController + + +@end + diff --git a/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/ViewController.m b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/ViewController.m new file mode 100644 index 0000000..59f8dd4 --- /dev/null +++ b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/ViewController.m @@ -0,0 +1,27 @@ +// +// ViewController.m +// CocoapodsTest +// + +#import "ViewController.h" +#import +#import + +@interface ViewController () + +@end + +@implementation ViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + [Paystack setDefaultPublishableKey:@"test"]; + // Do any additional setup after loading the view, typically from a nib. +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +@end diff --git a/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/main.m b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/main.m new file mode 100644 index 0000000..e1924b5 --- /dev/null +++ b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTest/main.m @@ -0,0 +1,13 @@ +// +// main.m +// CocoapodsTest +// + +#import +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTestTests/CocoapodsTestTests.m b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTestTests/CocoapodsTestTests.m new file mode 100644 index 0000000..f0488f0 --- /dev/null +++ b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTestTests/CocoapodsTestTests.m @@ -0,0 +1,37 @@ +// +// CocoapodsTestTests.m +// CocoapodsTestTests +// + +#import +#import + +@interface CocoapodsTestTests : XCTestCase + +@end + +@implementation CocoapodsTestTests + +- (void)setUp { + [super setUp]; + // Put setup code here. This method is called before the invocation of each test method in the class. +} + +- (void)tearDown { + // Put teardown code here. This method is called after the invocation of each test method in the class. + [super tearDown]; +} + +- (void)testExample { + // This is an example of a functional test case. + XCTAssert(YES, @"Pass"); +} + +- (void)testPerformanceExample { + // This is an example of a performance test case. + [self measureBlock:^{ + // Put the code you want to measure the time of here. + }]; +} + +@end diff --git a/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTestTests/Info.plist b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTestTests/Info.plist new file mode 100644 index 0000000..7330e97 --- /dev/null +++ b/Tests/installation_tests/cocoapods/without_frameworks/CocoapodsTestTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.jflinter.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Tests/installation_tests/cocoapods/without_frameworks/Podfile b/Tests/installation_tests/cocoapods/without_frameworks/Podfile new file mode 100644 index 0000000..3b3986f --- /dev/null +++ b/Tests/installation_tests/cocoapods/without_frameworks/Podfile @@ -0,0 +1,8 @@ +pod 'Paystack', path: '../../../..' +pod 'Paystack/ApplePay', path: '../../../..' + +post_install do |installer| + installer.pods_project.build_configurations.each do |config| + config.build_settings['GCC_TREAT_WARNINGS_AS_ERRORS'] = "YES" + end +end diff --git a/Tests/installation_tests/cocoapods/without_frameworks/test.sh b/Tests/installation_tests/cocoapods/without_frameworks/test.sh new file mode 100755 index 0000000..e2681bf --- /dev/null +++ b/Tests/installation_tests/cocoapods/without_frameworks/test.sh @@ -0,0 +1,8 @@ +#!/bin/sh + +echo "Checking test CocoaPods app..." +cd $(dirname $0) + +rm -rf Pods +rm -f Podfile.lock +pod install --no-repo-update && xctool build -workspace CocoapodsTest.xcworkspace -scheme CocoapodsTest -sdk iphonesimulator diff --git a/Tests/installation_tests/manual_installation/ManualInstallationTest.xcodeproj/project.pbxproj b/Tests/installation_tests/manual_installation/ManualInstallationTest.xcodeproj/project.pbxproj new file mode 100644 index 0000000..95d130f --- /dev/null +++ b/Tests/installation_tests/manual_installation/ManualInstallationTest.xcodeproj/project.pbxproj @@ -0,0 +1,447 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 047C06A51B06830800360F75 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 047C06A41B06830800360F75 /* main.m */; }; + 047C06A81B06830800360F75 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 047C06A71B06830800360F75 /* AppDelegate.m */; }; + 047C06AB1B06830800360F75 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 047C06AA1B06830800360F75 /* ViewController.m */; }; + 047C06AE1B06830800360F75 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 047C06AC1B06830800360F75 /* Main.storyboard */; }; + 047C06B01B06830800360F75 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 047C06AF1B06830800360F75 /* Images.xcassets */; }; + 047C06B31B06830800360F75 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 047C06B11B06830800360F75 /* LaunchScreen.xib */; }; + 047C06BF1B06830800360F75 /* ManualInstallationTestTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 047C06BE1B06830800360F75 /* ManualInstallationTestTests.m */; }; + 047C06CD1B068D0200360F75 /* Stripe.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 047C06CC1B068D0200360F75 /* Stripe.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 047C06B91B06830800360F75 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 047C06971B06830800360F75 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 047C069E1B06830800360F75; + remoteInfo = ManualInstallationTest; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 047C069F1B06830800360F75 /* ManualInstallationTest.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ManualInstallationTest.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 047C06A31B06830800360F75 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 047C06A41B06830800360F75 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 047C06A61B06830800360F75 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 047C06A71B06830800360F75 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 047C06A91B06830800360F75 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; + 047C06AA1B06830800360F75 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; + 047C06AD1B06830800360F75 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 047C06AF1B06830800360F75 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 047C06B21B06830800360F75 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; + 047C06B81B06830800360F75 /* ManualInstallationTestTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ManualInstallationTestTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 047C06BD1B06830800360F75 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 047C06BE1B06830800360F75 /* ManualInstallationTestTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ManualInstallationTestTests.m; sourceTree = ""; }; + 047C06CC1B068D0200360F75 /* Stripe.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Stripe.framework; path = ManualInstallationTest/Frameworks/Stripe.framework; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 047C069C1B06830800360F75 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 047C06CD1B068D0200360F75 /* Stripe.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 047C06B51B06830800360F75 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 047C06961B06830800360F75 = { + isa = PBXGroup; + children = ( + 047C06CC1B068D0200360F75 /* Stripe.framework */, + 047C06A11B06830800360F75 /* ManualInstallationTest */, + 047C06BB1B06830800360F75 /* ManualInstallationTestTests */, + 047C06A01B06830800360F75 /* Products */, + ); + sourceTree = ""; + }; + 047C06A01B06830800360F75 /* Products */ = { + isa = PBXGroup; + children = ( + 047C069F1B06830800360F75 /* ManualInstallationTest.app */, + 047C06B81B06830800360F75 /* ManualInstallationTestTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 047C06A11B06830800360F75 /* ManualInstallationTest */ = { + isa = PBXGroup; + children = ( + 047C06A61B06830800360F75 /* AppDelegate.h */, + 047C06A71B06830800360F75 /* AppDelegate.m */, + 047C06A91B06830800360F75 /* ViewController.h */, + 047C06AA1B06830800360F75 /* ViewController.m */, + 047C06AC1B06830800360F75 /* Main.storyboard */, + 047C06AF1B06830800360F75 /* Images.xcassets */, + 047C06B11B06830800360F75 /* LaunchScreen.xib */, + 047C06A21B06830800360F75 /* Supporting Files */, + ); + path = ManualInstallationTest; + sourceTree = ""; + }; + 047C06A21B06830800360F75 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 047C06A31B06830800360F75 /* Info.plist */, + 047C06A41B06830800360F75 /* main.m */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 047C06BB1B06830800360F75 /* ManualInstallationTestTests */ = { + isa = PBXGroup; + children = ( + 047C06BE1B06830800360F75 /* ManualInstallationTestTests.m */, + 047C06BC1B06830800360F75 /* Supporting Files */, + ); + path = ManualInstallationTestTests; + sourceTree = ""; + }; + 047C06BC1B06830800360F75 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 047C06BD1B06830800360F75 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 047C069E1B06830800360F75 /* ManualInstallationTest */ = { + isa = PBXNativeTarget; + buildConfigurationList = 047C06C21B06830800360F75 /* Build configuration list for PBXNativeTarget "ManualInstallationTest" */; + buildPhases = ( + 047C069B1B06830800360F75 /* Sources */, + 047C069C1B06830800360F75 /* Frameworks */, + 047C069D1B06830800360F75 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = ManualInstallationTest; + productName = ManualInstallationTest; + productReference = 047C069F1B06830800360F75 /* ManualInstallationTest.app */; + productType = "com.apple.product-type.application"; + }; + 047C06B71B06830800360F75 /* ManualInstallationTestTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 047C06C51B06830800360F75 /* Build configuration list for PBXNativeTarget "ManualInstallationTestTests" */; + buildPhases = ( + 047C06B41B06830800360F75 /* Sources */, + 047C06B51B06830800360F75 /* Frameworks */, + 047C06B61B06830800360F75 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 047C06BA1B06830800360F75 /* PBXTargetDependency */, + ); + name = ManualInstallationTestTests; + productName = ManualInstallationTestTests; + productReference = 047C06B81B06830800360F75 /* ManualInstallationTestTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 047C06971B06830800360F75 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0630; + ORGANIZATIONNAME = stripe; + TargetAttributes = { + 047C069E1B06830800360F75 = { + CreatedOnToolsVersion = 6.3; + }; + 047C06B71B06830800360F75 = { + CreatedOnToolsVersion = 6.3; + TestTargetID = 047C069E1B06830800360F75; + }; + }; + }; + buildConfigurationList = 047C069A1B06830800360F75 /* Build configuration list for PBXProject "ManualInstallationTest" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 047C06961B06830800360F75; + productRefGroup = 047C06A01B06830800360F75 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 047C069E1B06830800360F75 /* ManualInstallationTest */, + 047C06B71B06830800360F75 /* ManualInstallationTestTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 047C069D1B06830800360F75 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 047C06AE1B06830800360F75 /* Main.storyboard in Resources */, + 047C06B31B06830800360F75 /* LaunchScreen.xib in Resources */, + 047C06B01B06830800360F75 /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 047C06B61B06830800360F75 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 047C069B1B06830800360F75 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 047C06AB1B06830800360F75 /* ViewController.m in Sources */, + 047C06A81B06830800360F75 /* AppDelegate.m in Sources */, + 047C06A51B06830800360F75 /* main.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 047C06B41B06830800360F75 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 047C06BF1B06830800360F75 /* ManualInstallationTestTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 047C06BA1B06830800360F75 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 047C069E1B06830800360F75 /* ManualInstallationTest */; + targetProxy = 047C06B91B06830800360F75 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 047C06AC1B06830800360F75 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 047C06AD1B06830800360F75 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 047C06B11B06830800360F75 /* LaunchScreen.xib */ = { + isa = PBXVariantGroup; + children = ( + 047C06B21B06830800360F75 /* Base */, + ); + name = LaunchScreen.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 047C06C01B06830800360F75 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 047C06C11B06830800360F75 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 047C06C31B06830800360F75 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/ManualInstallationTest/Frameworks", + ); + INFOPLIST_FILE = ManualInstallationTest/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 047C06C41B06830800360F75 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/ManualInstallationTest/Frameworks", + ); + INFOPLIST_FILE = ManualInstallationTest/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 047C06C61B06830800360F75 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = ManualInstallationTestTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ManualInstallationTest.app/ManualInstallationTest"; + }; + name = Debug; + }; + 047C06C71B06830800360F75 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + INFOPLIST_FILE = ManualInstallationTestTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ManualInstallationTest.app/ManualInstallationTest"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 047C069A1B06830800360F75 /* Build configuration list for PBXProject "ManualInstallationTest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 047C06C01B06830800360F75 /* Debug */, + 047C06C11B06830800360F75 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 047C06C21B06830800360F75 /* Build configuration list for PBXNativeTarget "ManualInstallationTest" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 047C06C31B06830800360F75 /* Debug */, + 047C06C41B06830800360F75 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 047C06C51B06830800360F75 /* Build configuration list for PBXNativeTarget "ManualInstallationTestTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 047C06C61B06830800360F75 /* Debug */, + 047C06C71B06830800360F75 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 047C06971B06830800360F75 /* Project object */; +} diff --git a/Tests/installation_tests/manual_installation/ManualInstallationTest.xcodeproj/xcshareddata/xcschemes/ManualInstallationTest.xcscheme b/Tests/installation_tests/manual_installation/ManualInstallationTest.xcodeproj/xcshareddata/xcschemes/ManualInstallationTest.xcscheme new file mode 100644 index 0000000..e47f33f --- /dev/null +++ b/Tests/installation_tests/manual_installation/ManualInstallationTest.xcodeproj/xcshareddata/xcschemes/ManualInstallationTest.xcscheme @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/installation_tests/manual_installation/ManualInstallationTest/AppDelegate.h b/Tests/installation_tests/manual_installation/ManualInstallationTest/AppDelegate.h new file mode 100644 index 0000000..a72350f --- /dev/null +++ b/Tests/installation_tests/manual_installation/ManualInstallationTest/AppDelegate.h @@ -0,0 +1,14 @@ +// +// AppDelegate.h +// ManualInstallationTest +// + +#import + +@interface AppDelegate : UIResponder + +@property (strong, nonatomic) UIWindow *window; + + +@end + diff --git a/Tests/installation_tests/manual_installation/ManualInstallationTest/AppDelegate.m b/Tests/installation_tests/manual_installation/ManualInstallationTest/AppDelegate.m new file mode 100644 index 0000000..d1119c5 --- /dev/null +++ b/Tests/installation_tests/manual_installation/ManualInstallationTest/AppDelegate.m @@ -0,0 +1,45 @@ +// +// AppDelegate.m +// ManualInstallationTest +// + +#import "AppDelegate.h" +#import + +@interface AppDelegate () + +@end + +@implementation AppDelegate + + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { + // Override point for customization after application launch. + [Paystack setDefaultPublishableKey:@"test"]; + [Paystack paymentRequestWithMerchantIdentifier:@"test"]; + return YES; +} + +- (void)applicationWillResignActive:(UIApplication *)application { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. +} + +- (void)applicationDidEnterBackground:(UIApplication *)application { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. +} + +- (void)applicationWillEnterForeground:(UIApplication *)application { + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. +} + +- (void)applicationDidBecomeActive:(UIApplication *)application { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. +} + +- (void)applicationWillTerminate:(UIApplication *)application { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. +} + +@end diff --git a/Tests/installation_tests/manual_installation/ManualInstallationTest/Base.lproj/LaunchScreen.xib b/Tests/installation_tests/manual_installation/ManualInstallationTest/Base.lproj/LaunchScreen.xib new file mode 100644 index 0000000..c8fb73b --- /dev/null +++ b/Tests/installation_tests/manual_installation/ManualInstallationTest/Base.lproj/LaunchScreen.xib @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/installation_tests/manual_installation/ManualInstallationTest/Base.lproj/Main.storyboard b/Tests/installation_tests/manual_installation/ManualInstallationTest/Base.lproj/Main.storyboard new file mode 100644 index 0000000..d912f9d --- /dev/null +++ b/Tests/installation_tests/manual_installation/ManualInstallationTest/Base.lproj/Main.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Tests/installation_tests/manual_installation/ManualInstallationTest/Images.xcassets/AppIcon.appiconset/Contents.json b/Tests/installation_tests/manual_installation/ManualInstallationTest/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..118c98f --- /dev/null +++ b/Tests/installation_tests/manual_installation/ManualInstallationTest/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,38 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Tests/installation_tests/manual_installation/ManualInstallationTest/Info.plist b/Tests/installation_tests/manual_installation/ManualInstallationTest/Info.plist new file mode 100644 index 0000000..81bfe66 --- /dev/null +++ b/Tests/installation_tests/manual_installation/ManualInstallationTest/Info.plist @@ -0,0 +1,40 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.paystack.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Tests/installation_tests/manual_installation/ManualInstallationTest/ViewController.h b/Tests/installation_tests/manual_installation/ManualInstallationTest/ViewController.h new file mode 100644 index 0000000..9cf10f4 --- /dev/null +++ b/Tests/installation_tests/manual_installation/ManualInstallationTest/ViewController.h @@ -0,0 +1,12 @@ +// +// ViewController.h +// ManualInstallationTest +// + +#import + +@interface ViewController : UIViewController + + +@end + diff --git a/Tests/installation_tests/manual_installation/ManualInstallationTest/ViewController.m b/Tests/installation_tests/manual_installation/ManualInstallationTest/ViewController.m new file mode 100644 index 0000000..b8ed3e2 --- /dev/null +++ b/Tests/installation_tests/manual_installation/ManualInstallationTest/ViewController.m @@ -0,0 +1,24 @@ +// +// ViewController.m +// ManualInstallationTest +// + +#import "ViewController.h" + +@interface ViewController () + +@end + +@implementation ViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + // Do any additional setup after loading the view, typically from a nib. +} + +- (void)didReceiveMemoryWarning { + [super didReceiveMemoryWarning]; + // Dispose of any resources that can be recreated. +} + +@end diff --git a/Tests/installation_tests/manual_installation/ManualInstallationTest/main.m b/Tests/installation_tests/manual_installation/ManualInstallationTest/main.m new file mode 100644 index 0000000..a41da65 --- /dev/null +++ b/Tests/installation_tests/manual_installation/ManualInstallationTest/main.m @@ -0,0 +1,13 @@ +// +// main.m +// ManualInstallationTest +// + +#import +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} diff --git a/Tests/installation_tests/manual_installation/ManualInstallationTestTests/Info.plist b/Tests/installation_tests/manual_installation/ManualInstallationTestTests/Info.plist new file mode 100644 index 0000000..0700e1f --- /dev/null +++ b/Tests/installation_tests/manual_installation/ManualInstallationTestTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.paystack.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Tests/installation_tests/manual_installation/ManualInstallationTestTests/ManualInstallationTestTests.m b/Tests/installation_tests/manual_installation/ManualInstallationTestTests/ManualInstallationTestTests.m new file mode 100644 index 0000000..b7b45a1 --- /dev/null +++ b/Tests/installation_tests/manual_installation/ManualInstallationTestTests/ManualInstallationTestTests.m @@ -0,0 +1,37 @@ +// +// ManualInstallationTestTests.m +// ManualInstallationTestTests +// + +#import +#import + +@interface ManualInstallationTestTests : XCTestCase + +@end + +@implementation ManualInstallationTestTests + +- (void)setUp { + [super setUp]; + // Put setup code here. This method is called before the invocation of each test method in the class. +} + +- (void)tearDown { + // Put teardown code here. This method is called after the invocation of each test method in the class. + [super tearDown]; +} + +- (void)testExample { + // This is an example of a functional test case. + XCTAssert(YES, @"Pass"); +} + +- (void)testPerformanceExample { + // This is an example of a performance test case. + [self measureBlock:^{ + // Put the code you want to measure the time of here. + }]; +} + +@end diff --git a/Tests/installation_tests/manual_installation/test.sh b/Tests/installation_tests/manual_installation/test.sh new file mode 100755 index 0000000..46cc354 --- /dev/null +++ b/Tests/installation_tests/manual_installation/test.sh @@ -0,0 +1,18 @@ +#!/bin/sh + +echo "Checking test manual installation app..." + +PROJECTDIR="$(cd $(dirname $0)/../../..; pwd)" +TESTDIR="$(cd $(dirname $0); pwd)" +BUILDDIR="$(cd $(dirname $0); pwd)/build" + +rm -rf $BUILDDIR +mkdir $BUILDDIR + +xcodebuild build -workspace "${PROJECTDIR}/Paystack.xcworkspace" -scheme PaystackiOSStaticFramework -configuration Release OBJROOT=$BUILDDIR SYMROOT=$BUILDDIR -sdk iphonesimulator | xcpretty -c + +rm -rf $TESTDIR/ManualInstallationTest/Frameworks +mkdir $TESTDIR/ManualInstallationTest/Frameworks +mv $BUILDDIR/Release-iphonesimulator/Paystack.framework $TESTDIR/ManualInstallationTest/Frameworks + +xctool build -project "${TESTDIR}/ManualInstallationTest.xcodeproj" -scheme ManualInstallationTest -sdk iphonesimulator diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..afaf360 --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +1.0.0 \ No newline at end of file diff --git a/ci_scripts/FauxPasConfig/main.fauxpas.json b/ci_scripts/FauxPasConfig/main.fauxpas.json new file mode 100644 index 0000000..f6dd84c --- /dev/null +++ b/ci_scripts/FauxPasConfig/main.fauxpas.json @@ -0,0 +1,840 @@ +// Generated from the Faux Pas GUI +{ + // Xcode target to check (String) + "target": "PaystackiOS", + // Xcode build configuration to check (String) + "buildConfig": "Debug", + // Rules to apply (Array of strings) + "rules": ["APIAvailability","DefaultInExhaustiveSwitch","IBOutletsInPublicInterface","ImplicitAtomicProperty","InstanceMethodWritesToStaticVariable","MacroLiteral","MallocCast","MallocWithoutSizeof","NonTypedefBlockDeclaration","ReservedIdentifierNaming","StrongInsteadOfRetain","UnusedTranslation","UsedVariableMarkedUnused","XIBUnknownClassReference"], + // Rules to apply only (Array of strings) + //"onlyRules": [], + // Rule tags to apply (Array of strings) + //"ruleTags": ["Recommended"], + // Rules to exclude (Array of strings) + "excludedRules": ["ImplicitBundleId","NullCoalescingOp","RecommendedVCSIgnores"], + // Prefixes of files to exclude (Array of strings) + //"fileExclusionPrefixes": [], + // Xcode groups to exclude (Array of strings) + //"fileExclusionXcodeGroups": ["Vendor"], + // Regexes for files to exclude (Array of regular expression strings) + //"fileExclusionRegexes": [], + // Minimum diagnostic severity to return nonzero exit status ("Concern" / + // "Warning" / "Error" / "Fatal" / "None") + //"minErrorStatusSeverity": "Error", + // Xcode workspace to build project with (File path) + //"workspace": null, + // Xcode scheme to build project with (String) + //"scheme": null, + // Number of concurrent file checking jobs (Positive integer) + "numConcurrentJobs": null, + // Additional compiler arguments to use (Array of strings) + //"extraCompilerArgs": [], + // Additional xcodebuild arguments to use (Array of strings) + "extraXcodebuildArgs": ["DEFINES_MODULE=NO"], + // Build project before checking (Boolean) + //"fullBuild": false, + // Cache project build logs (Boolean) + //"cacheBuildLog": true, + // Use our own modules cache (Boolean) + //"useOwnModulesCache": true, + // Process only target precompiled headers (Boolean) + //"processOnlyTargetPCHs": true, + // Verbose output (Boolean) + //"verbose": false, + // Output format ("human" / "json" / "plist" / "xcode") + //"outputFormat": "human", + + // Options for rules: + "ruleOptions": { + // Options for localization rules + "_LocalizationRules": { + // Functions used in place of NSLocalizedString (Array of strings) + //"localizedStringRoutines": [] + }, + // Options for rule: +[NSObject load] method without an + // @autoreleasepool + "LoadMethodWithoutAutoreleasePool": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Absolute path in build setting value + "AbsPathInBuildSetting": { + // Allow system paths (Boolean) + //"allowSystemPaths": false + // Regexes for allowed paths (Array of regular expression strings) + //"allowedPathRegexes": null + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Assigning delegate property + "AssigningDelegate": { + // Allow unsafe_unretained delegates (Boolean) + //"allowUnsafeUnretained": false + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Assignment of literal zero to pointer + "ZeroAssignmentToPointer": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Assignment of weak-unavailable object to a weak + // property + "UnsupportedWeakReference": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Associated object on value-like type + "AssociatedObjectOnValueType": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Block-typed declaration without typedef + "NonTypedefBlockDeclaration": { + // Apply only to function/method arguments (Boolean) + //"onlyArguments": true, + // Regexes for ignored file paths (Array of regular expression + // strings) + "ignoredFileRegexes": ["PSTCKAPIPostRequest.*"] + }, + // Options for rule: Build settings set in Xcode GUI + "BuildSettingsSetInGUI": { + // Which settings are allowed to be set in the GUI (Array of + // strings) + //"allowedGUISettings": ["CODE_SIGN_IDENTITY","PROVISIONING_PROFILE"] + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Casting the return value of malloc() + "MallocCast": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Category used for “private” declarations + "PrivateCategory": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Class implements -isEqual: but not -hash + "IsEqualAndHash": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Code refers to unknown resource + "UnknownResourceCodeReference": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Complete NSNotificationCenter detachment + "CompleteNotificationCenterDetachment": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Conflicting category methods + "CategoryMethodConflict": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Constructor return type + "ConstructorReturnType": { + // Check init methods (Boolean) + //"checkInitMethods": false + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Copying property of mutable NSCopying type + "CopyingMutableProperty": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Direction of ordered comparison operators + "OrderedComparisonOpDirection": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Discarded opaque NSNotificationCenter observer + "DiscardedOpaqueNotificationObserver": { + // Do not warn if explicitly cast to void (Boolean) + //"suppressViaVoidCast": true + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Dot syntax usage + "DotSyntax": { + // Enforce dot syntax only for properties (Boolean) + //"onlyForProperties": true, + // Square bracket syntax method whitelist (Array of strings) + "allowedMethods": ["alloc","autorelease","becomeFirstResponder","new","release","retain","runModal","setNeedsDisplay:"] + // Allow factory methods like +[NSArray array] (Boolean) + //"allowConstructors": true + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Duplicate resource + "DuplicateResource": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Duplicate translation + "DuplicateTranslation": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Dynamic library install name + "DylibInstallName": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Element variable of fast enumeration loop declared + // outside the loop + "FastEnumElementOutside": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Fixed-format NSDateFormatter not using invariant + // (POSIX) locale + "FixedFormatDateFormatter": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Fragile error condition check + "ErrorConditionCheck": { + // Apply only to system framework methods (Boolean) + //"onlySystemFrameworks": false + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Global and localized resource + "GlobalAndLocalizedResource": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Globally caching a thread-unsafe class instance + "ThreadUnsafeInstanceCaching": { + // The thread-unsafe classes to warn about (Array of strings) + "classNames": ["NSDateFormatter","NSMutableArray","NSMutableAttributedString","NSMutableCharacterSet","NSMutableData","NSMutableDictionary","NSMutableSet","NSMutableString","NSNumberFormatter"] + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Hardcoded self class reference + "HardcodedSelfClass": { + // Warn only about allocations (Boolean) + //"warnOnlyAboutAlloc": false + // Check only factory methods (Boolean) + //"checkOnlyFactoryMethods": false + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: IBOutlets in public interface + "IBOutletsInPublicInterface": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Identifier naming + "IdentifierNaming": { + // Instance variable name format regex (Regular expression) + //"ivarNameFormat": "^_.+" + // Local variable name format regex (Regular expression) + //"localVarNameFormat": "^[^_].*" + // Function name format regex (Regular expression) + //"functionNameFormat": null + // Typedef name format regex (Regular expression) + //"typedefNameFormat": null + // Macro name format regex (Regular expression) + //"macroNameFormat": null + // Objective-C method name format regex (Regular expression) + //"objcMethodNameFormat": null + // Objective-C class name format regex (Regular expression) + //"objcClassNameFormat": null + // Objective-C category name format regex (Regular expression) + //"objcCategoryNameFormat": null + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Implicit bundle identifier + "ImplicitBundleId": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Implicitly atomic property + "ImplicitAtomicProperty": { + // Apply only to UIKit/AppKit subclasses (Boolean) + //"applyOnlyToUIClasses": true + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Incorrect placement of build setting value + "BuildSettingPlacement": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Instance method writes to static variable + "InstanceMethodWritesToStaticVariable": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Invalid string resource file + "InvalidStringsFile": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Invocation of superclass implementation of + // +[NSObject initialize] + "InitializeSuperInvocation": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Literal string for key path + "LiteralStringKeyPath": { + // Ignore -valueForKey: (etc) for collections (Boolean) + //"ignoreCollectionsValueForKey": true + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Macro definition for literal value + "MacroLiteral": { + // Allowed literal values (Array of strings) + //"allowedLiterals": ["0","1"] + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Macro-based include guard + "MacroBasedIncludeGuard": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Memory allocation without using sizeof + "MallocWithoutSizeof": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Method swizzling + "Swizzling": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Missing API usage description + "MissingAPIUsageDescription": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Missing NSNotificationCenter observer detachment + "MissingNotificationCenterDetachment": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Missing device type resource + "MissingDeviceTypeResource": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Missing image resolution variant + "MissingImageResolutionVariant": { + // Expected resolution scales (Array of numbers) + //"expectedScales": ["1","2","3"] + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Missing translation + "MissingTranslation": { + // Warn about missing development region translations (Boolean) + //"checkDevRegion": false + // Ignored key prefixes (Array of strings) + //"ignoredKeyPrefixes": [] + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Modifying the value of an argument variable + "ArgumentModification": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Moving common inclusions into prefix header + "PrefixHeaderIncludeSuggestion": { + // Show including files (Boolean) + //"showFiles": false + // Warning threshold percentage (Positive integer) + //"warningThresholdPercent": 30 + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: NSLog() used in release build + "NSLogUsed": { + // Allow calling NSLog() via macros (Boolean) + //"allowMacros": true + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Non-copying property of immutable NSCopying type + "RetainingImmutableProperty": { + // Ignore private properties (Boolean) + //"ignorePrivateProperties": true + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Null coalescing operator usage + "NullCoalescingOp": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Observing UIKit object using KVO + "UIKitKVO": { + // Allow observing custom UIKit subclasses (Boolean) + //"allowSubclasses": true + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Old, verbose Objective-C syntax + "OldVerboseObjCSyntax": { + // Expect literal syntax for mutable collections (Boolean) + //"expectLiteralSyntaxForMutableCollections": false + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Ordered comparison of pointer and zero + "OrderedPointerToZeroComparison": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Overridden +[NSObject initialize] method in a + // category + "InitializeMethodCategoryOverride": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Possibly unused Objective-C method + "UnusedMethod": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Possibly unused resource + "UnusedResource": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Potential assertion side effects + "AssertionSideEffects": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Problematic release build compiler arguments + "ReleaseBuildCompilerArgs": { + // Required compiler arguments for all files (Array of strings) + "requiredArguments": ["-DNDEBUG","-DNS_BLOCK_ASSERTIONS"] + // Disallowed compiler arguments for all files (Array of strings) + //"disallowedArguments": [] + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Problematic release build settings + "ReleaseBuildConfig": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Project reference to file ignored in the VCS + "FileRefIgnoredInVCS": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Project reference to file outside version control + // root + "FileRefOutsideVCS": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Project reference to file using absolute path + "FileRefWithAbsPath": { + // Allow system paths (Boolean) + //"allowSystemPaths": false + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Recommended VCS ignores + "RecommendedVCSIgnores": { + // Whether the Xcode workspace data should be ignored (Boolean) + //"workspaceIgnored": false + // Whether CocoaPods data should be ignored (Boolean) + //"cocoaPodsIgnored": false + // Whether Carthage/Build should be ignored (Boolean) + //"carthageBuildIgnored": true + // Whether Carthage/Checkouts should be ignored (Boolean) + //"carthageCheckoutsIgnored": false + // Whether user-specific AppCode data should be ignored (Boolean) + //"appCodeUserDataIgnored": true + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Recommended compiler warning options + "CompilerWarnings": { + // Recommended warning flags (Array of strings) + "flags": ["-Wall","-Wconversion","-Wdeprecated-implementations","-Wempty-body","-Werror","-Wextra","-Wfloat-equal","-Wimplicit-retain-self","-Wnewline-eof","-Wreturn-type","-Wshadow","-Wsign-compare","-Wundef"] + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Recommended project settings + "BasicProjectSettings": { + // The indentation type that should be set ("tabs" / "spaces") + //"indentType": null + // The ‘tab width’ that should be set (Positive integer) + //"tabWidth": null + // The ‘indent width’ that should be set (Positive integer) + //"indentWidth": null + // Whether the ‘wrap lines’ setting should be set or not ("wrap" / + // "nowrap") + //"wrapLines": null + // Whether the ‘class prefix’ project setting should have a value + // (Boolean) + //"expectClassPrefix": true + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Redundant inclusion directive + "RedundantInclude": { + // Ignore system headers (Boolean) + //"ignoreSystemHeaders": true + // Ignore indirect inclusions (Boolean) + //"ignoreIndirectInclusions": false + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Reserved identifier name + "ReservedIdentifierNaming": { + // Check for identifier names reserved by the C standard (Boolean) + //"checkCStandard": true, + // Check for identifier names reserved by the POSIX standard + // (Boolean) + //"checkPOSIXStandard": true, + // Regexes for ignored file paths (Array of regular expression + // strings) + "ignoredFileRegexes": ["PSTCKNullabilityMacros.h"] + }, + // Options for rule: Reserved symbol prefix + "ReservedPrefix": { + // Allow two-character prefixes that don’t overlap system + // frameworks (Boolean) + //"allowNonOverlappingTwoCharPrefix": false + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Restricted direct method call + "RestrictedDirectMethodCall": { + // Allow direct calls from subclasses (Boolean) + //"allowInSubclass": true + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Restricted method override + "RestrictedMethodOverride": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Retain cycle in block API usage + "BlockAPIRetainCycle": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Retaining or copying delegate + "StrongDelegate": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Setter invocation in init or dealloc method + "SetterInvocationInInitOrDealloc": { + // Apply to init methods (Boolean) + //"applyToInit": true + // Apply to dealloc methods (Boolean) + //"applyToDealloc": true + // Warn only if ivar available (Boolean) + //"onlyIfIvarAvailable": true + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Shortcut initializer + "NewInitializer": { + // Prefer the alloc-init style (Boolean) + //"preferAllocInit": true + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: String resource file is not UTF-8 + "StringsFileEncoding": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Stringsdict file without matching string resource + // file + "StringsdictWithoutStrings": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Suspicious bundle resources + "SuspiciousResources": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Suspicious date-time format + "SuspiciousDateTimeFormat": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Suspicious missing bundle resources + "SuspiciousMissingResources": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Terminating the app in a release build + "TerminatingApp": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Throwing an Objective-C exception + "ThrowingObjCException": { + // Allow if sole statement (Boolean) + //"allowIfSoleStatement": false + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Translation border punctuation mismatch + "TranslationPunctuation": { + // Punctuation characters that should match (String) + //"punctuationChars": ".,:;!?…。" + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Translation format mismatch + "TranslationFormatMismatch": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: UI String not localized + "HardcodedUIString": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Uncommented localized string + "UncommentedLocalizedString": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Undetached delegate or data source + "UndetachedDelegate": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Unexpected retina image resolution + "RetinaImagesResolution": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Unidiomatic accessor naming + "UnidiomaticAccessorNaming": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Unknown resource file name modifier + "UnknownResourceModifier": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Unnecessary NULL check before free() + "UnnecessaryNullCheck": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Unnecessary Nib method + "UnnecessaryNibMethod": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Unnecessary default case in exhaustive switch + // statement + "DefaultInExhaustiveSwitch": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Unprefixed Objective-C class + "UnprefixedClass": { + // Regexes for ignored file paths (Array of regular expression + // strings) + "ignoredFileRegexes": ["Fabric.h","PSTCKAPIClient.h"] + }, + // Options for rule: Unprefixed category method + "UnprefixedCategoryMethod": { + // Allowed prefixes (Array of strings) + //"prefixes": null + // Ignore setters (Boolean) + //"ignoreSetters": true + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Unused error value + "UnusedErrorValue": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Unused translation + "UnusedTranslation": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Usage of retain in ARC code + "StrongInsteadOfRetain": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Use of API not available in the minimum deployment + // target + "APIAvailability": { + // Avoid false positives (Boolean) + //"avoidFalsePositives": true, + // Regexes for ignored file paths (Array of regular expression + // strings) + "ignoredFileRegexes": [".*ApplePay.*"] + }, + // Options for rule: Using -[UIViewController initWithNibName:bundle:] + // outside the UIViewController implementation + "ViewControllerInitWithNibName": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Using a variable marked unused + "UsedVariableMarkedUnused": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Weak reference to top-level XIB object + "WeakReferenceToTopLevelXIBObject": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: XIB Reference to unknown class + "XIBUnknownClassReference": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: XIB User-defined runtime attribute mismatch + "XIBRuntimeAttributeMismatch": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: XIB refers to unknown resource + "UnknownResourceXIBReference": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Xcode build configuration file overwrites + // previously set value + "XcconfigOverwrites": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + }, + // Options for rule: Xcode build setting refers to itself + "BuildSettingSelfReference": { + // Regexes for ignored file paths (Array of regular expression + // strings) + //"ignoredFileRegexes": null + } + } +} diff --git a/ci_scripts/check_fauxpas.sh b/ci_scripts/check_fauxpas.sh new file mode 100755 index 0000000..218b5da --- /dev/null +++ b/ci_scripts/check_fauxpas.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +if [[ $CI && "$TRAVIS_SECURE_ENV_VARS" != "true" ]]; then + echo "Skipping Faux Pas linting." + exit 0 +fi + +echo "Linting with Faux Pas..." +fauxpas check Paystack.xcodeproj/ --target "PaystackiOSStatic" --configFile "./ci_scripts/FauxPasConfig/main.fauxpas.json" --minErrorStatusSeverity Concern && fauxpas check Paystack.xcodeproj/ --target "PaystackOSX" --configFile "./ci_scripts/FauxPasConfig/main.fauxpas.json" --minErrorStatusSeverity Concern diff --git a/ci_scripts/check_version.rb b/ci_scripts/check_version.rb new file mode 100755 index 0000000..ea2f7f2 --- /dev/null +++ b/ci_scripts/check_version.rb @@ -0,0 +1,20 @@ +#!/usr/bin/env ruby + +puts "Checking that version is set correctly..." +git_version = `git describe`.strip.split("-").first # this is the most recent tag +file_version = File.open('VERSION').first.strip +search_result = `grep #{file_version} ./Paystack/PublicHeaders/PSTCKAPIClient.h` + +if search_result.length == 0 + abort("VERSION does not match PSTCKSDKVersion in PSTCKAPIClient.h") +end + +if ENV["TRAVIS_BRANCH"] == "master" + + if git_version > "v#{file_version}" + abort("Current git tag is greater than VERSION, did you forget to increment it?") + end + +end + +puts "Done!" diff --git a/ci_scripts/export_builds.sh b/ci_scripts/export_builds.sh new file mode 100755 index 0000000..a4c8259 --- /dev/null +++ b/ci_scripts/export_builds.sh @@ -0,0 +1,21 @@ +PROJECTDIR="$(cd $(dirname $0)/..; pwd)" +BUILDDIR="${PROJECTDIR}/build" +rm -rf $BUILDDIR +mkdir $BUILDDIR +cd $PROJECTDIR + +xcodebuild build -workspace Paystack.xcworkspace -scheme PaystackOSX -configuration Release OBJROOT=$BUILDDIR SYMROOT=$BUILDDIR | xcpretty -c +cd $BUILDDIR/Release +mkdir PaystackOSX +mv PaystackOSX.framework PaystackOSX +ditto -ck --rsrc --sequesterRsrc --keepParent PaystackOSX PaystackOSX.zip +cp PaystackOSX.zip $BUILDDIR +cd - + +xcodebuild build -workspace Paystack.xcworkspace -scheme PaystackiOSStaticFramework -configuration Release OBJROOT=$BUILDDIR SYMROOT=$BUILDDIR | xcpretty -c +cd $BUILDDIR/Release-iphonesimulator +mkdir PaystackiOS +mv Paystack.framework PaystackiOS +ditto -ck --rsrc --sequesterRsrc --keepParent PaystackiOS PaystackiOS.zip +cp PaystackiOS.zip $BUILDDIR +cd - diff --git a/ci_scripts/install_fauxpas.sh b/ci_scripts/install_fauxpas.sh new file mode 100755 index 0000000..5b6e599 --- /dev/null +++ b/ci_scripts/install_fauxpas.sh @@ -0,0 +1,11 @@ +if [[ $CI && "$TRAVIS_SECURE_ENV_VARS" != "true" ]]; then + echo "Skipping Faux Pas installation." + exit 0 +fi + +brew install caskroom/cask/brew-cask +brew cask install fauxpas +$HOME/Applications/FauxPas.app/Contents/Resources/install-cli-tools +fauxpas updatelicense "organization-seat" "Paystack, Inc" $FAUX_PAS_LICENSE +# Enable beta xcode 7 support +defaults write org.hasseg.fauxpas experimentalXcode7SupportEnabled -bool yes