├── .gitignore ├── .swift-version ├── .travis.yml ├── Cartfile ├── LICENSE ├── Package.resolved ├── Package.swift ├── Podfile ├── README.md ├── RxValidator.podspec ├── RxValidator.xcodeproj ├── project.pbxproj └── xcshareddata │ └── xcschemes │ ├── RxValidator iOS.xcscheme │ ├── RxValidator macOS.xcscheme │ ├── RxValidator tvOS.xcscheme │ └── RxValidator watchOS.xcscheme ├── Sources ├── Validate.swift ├── ValidationTarget │ ├── DateValidationTarget.swift │ ├── NumberValidationTarget.swift │ └── StringValidationTarget.swift ├── extensions │ ├── Observable+Date+Extension.swift │ ├── Observable+Number+Extension.swift │ └── Observable+String+Extension.swift ├── protocols │ └── ValidationTarget.swift ├── result │ └── RxValidatorResult.swift └── rules │ ├── Date │ ├── DateShouldAfterOrSameThen.swift │ ├── DateShouldAfterThen.swift │ ├── DateShouldBeCloseDates.swift │ ├── DateShouldBeforeOrSameThen.swift │ ├── DateShouldBeforeThen.swift │ └── DateShouldEqualTo.swift │ ├── DateValidator.swift │ ├── Number │ ├── IntShouldBeEven.swift │ ├── NumberShouldEqualTo.swift │ ├── NumberShouldGreaterThan.swift │ └── NumberShouldLessThan.swift │ ├── NumberValidator.swift │ ├── String │ ├── StringIsAlwaysPass.swift │ ├── StringIsNotOverflowThen.swift │ ├── StringIsNotUnderflowThen.swift │ ├── StringShouldBeMatch.swift │ ├── StringShouldEqualTo.swift │ └── StringShouldNotBeEmpty.swift │ └── StringValidator.swift ├── Supporting Files ├── Info.plist └── RxValidator.h ├── Tests Host ├── Resources │ ├── Assets.xcassets │ │ ├── AppIcon.appiconset │ │ │ └── Contents.json │ │ └── Contents.json │ └── Base.lproj │ │ ├── LaunchScreen.storyboard │ │ └── Main.storyboard ├── Sources │ ├── AppDelegate.swift │ └── ViewController.swift └── Supporting Files │ └── Info.plist ├── Tests ├── AlwaysFailingTests.swift ├── DateValidateTests.swift ├── InstantValidateTests.swift ├── NumberValidateTests.swift ├── ObservableExtensionTests.swift ├── RxValidatorResultTests.swift ├── StringValidateRegexTests.swift ├── StringValidateTests.swift └── ValidationWithRxSwiftTests.swift └── codecov.yml /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData/ 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata/ 19 | 20 | ## Other 21 | *.moved-aside 22 | *.xccheckout 23 | *.xcscmblueprint 24 | 25 | ## Obj-C/Swift specific 26 | *.hmap 27 | *.ipa 28 | *.dSYM.zip 29 | *.dSYM 30 | 31 | ## Playgrounds 32 | timeline.xctimeline 33 | playground.xcworkspace 34 | 35 | # Swift Package Manager 36 | # 37 | # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. 38 | # Packages/ 39 | # Package.pins 40 | # Package.resolved 41 | .build/ 42 | 43 | # CocoaPods 44 | # 45 | # We recommend against adding the Pods directory to your .gitignore. However 46 | # you should judge for yourself, the pros and cons are mentioned at: 47 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 48 | # 49 | # Pods/ 50 | 51 | # Carthage 52 | # 53 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 54 | Carthage/Checkouts 55 | Carthage/Build 56 | 57 | # fastlane 58 | # 59 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the 60 | # screenshots whenever they are needed. 61 | # For more information about the recommended setup visit: 62 | # https://docs.fastlane.tools/best-practices/source-control/#source-control 63 | 64 | fastlane/report.xml 65 | fastlane/Preview.html 66 | fastlane/screenshots/**/*.png 67 | fastlane/test_output 68 | /Example/SwiftValidationCheckerExample/Podfile.lock 69 | Pods 70 | *.xcworkspace 71 | Podfile.lock 72 | Cartfile.resolved 73 | .DS_Store 74 | -------------------------------------------------------------------------------- /.swift-version: -------------------------------------------------------------------------------- 1 | 4.1 2 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # os: osx 2 | osx_image: xcode9.4 3 | language: swift 4 | sudo: required 5 | podfile: Example/RxValidatorExample/Podfile 6 | cache: cocoapods 7 | 8 | notifications: 9 | slack: '$SLACK_KEY' 10 | 11 | branches: 12 | only: 13 | - develop 14 | except: 15 | - screenshot 16 | env: 17 | global: 18 | - PROJECT="Example/RxValidatorExample/RxValidatorExample.xcworkspace" 19 | - SCHEME="RxValidatorExample" 20 | matrix: 21 | - TEST=1 DESTINATION="platform=iOS Simulator,name=iPhone X,OS=11.4" 22 | #- TEST=1 DESTINATION="arch=x86_64" 23 | #- TEST=1 DESTINATION="OS=11.4,name=Apple TV" 24 | #- TEST=0 DESTINATION="OS=4.3,name=Apple Watch - 38mm" 25 | 26 | before_install: 27 | - set -o pipefail 28 | 29 | script: 30 | - xcodebuild clean build test 31 | -workspace "$PROJECT" 32 | -scheme "$SCHEME" 33 | -destination "$DESTINATION" | xcpretty -c 34 | 35 | - pod lib lint --verbose --allow-warnings --fail-fast 36 | 37 | after_success: 38 | - bash <(curl -s https://codecov.io/bash) -J 'RxValidatorExample' 39 | -------------------------------------------------------------------------------- /Cartfile: -------------------------------------------------------------------------------- 1 | github "ReactiveX/RxSwift" >= 4.1.0 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "object": { 3 | "pins": [ 4 | { 5 | "package": "Nimble", 6 | "repositoryURL": "https://github.com/Quick/Nimble.git", 7 | "state": { 8 | "branch": null, 9 | "revision": "cd6dfb86f496fcd96ce0bc6da962cd936bf41903", 10 | "version": "7.3.1" 11 | } 12 | }, 13 | { 14 | "package": "Quick", 15 | "repositoryURL": "https://github.com/Quick/Quick.git", 16 | "state": { 17 | "branch": null, 18 | "revision": "5fbf13871d185526993130c3a1fad0b70bfe37ce", 19 | "version": "1.3.2" 20 | } 21 | }, 22 | { 23 | "package": "RxSwift", 24 | "repositoryURL": "https://github.com/ReactiveX/RxSwift.git", 25 | "state": { 26 | "branch": null, 27 | "revision": "3e848781c7756accced855a6317a4c2ff5e8588b", 28 | "version": "4.1.2" 29 | } 30 | }, 31 | { 32 | "package": "SwiftDate", 33 | "repositoryURL": "https://github.com/malcommac/SwiftDate", 34 | "state": { 35 | "branch": null, 36 | "revision": "1a1b395a890b94881056ee50bfee3ed2cf9c3149", 37 | "version": "5.0.9" 38 | } 39 | } 40 | ] 41 | }, 42 | "version": 1 43 | } 44 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:4.0 2 | import PackageDescription 3 | 4 | let package = Package( 5 | name: "RxValidator", 6 | products: [ 7 | .library(name: "RxValidator", targets: ["RxValidator"]) 8 | ], 9 | dependencies: [ 10 | .package(url: "https://github.com/ReactiveX/RxSwift.git", .upToNextMinor(from: "4.1.0")) 11 | ], 12 | targets: [ 13 | .target( 14 | name: "RxValidator", 15 | dependencies: ["RxSwift"], 16 | path: "Sources" 17 | ) 18 | ], 19 | swiftLanguageVersions: [4] 20 | ) 21 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | target 'RxValidatorTests' do 2 | use_frameworks! 3 | 4 | pod 'RxSwift', '~> 4.1.0' 5 | pod 'RxOptional' 6 | 7 | pod 'Quick', '1.3.1' 8 | pod 'Nimble', '7.3.0' 9 | pod 'SwiftDate', '5.0.9' 10 | end 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | [![License](https://img.shields.io/cocoapods/l/RxValidator.svg?style=flat)](http://cocoapods.org/pods/RxValidator) 3 | [![Platform](https://img.shields.io/cocoapods/p/RxValidator.svg?style=flat)](http://cocoapods.org/pods/RxValidator) 4 | [![Swift](https://img.shields.io/badge/Swift-4.1-orange.svg)](https://swift.org/blog/swift-4-1-released/) 5 | [![Version](https://img.shields.io/cocoapods/v/RxValidator.svg?style=flat)](http://cocoapods.org/pods/RxValidator) 6 | [![Build Status](https://travis-ci.org/vbmania/RxValidator.svg?branch=develop)](https://travis-ci.org/vbmania/RxValidator) 7 | [![codecov.io](https://codecov.io/gh/vbmania/RxValidator/branch/develop/graphs/badge.svg)](https://codecov.io/gh/vbmania/RxValidator/branch/develop) 8 | 9 | # RxValidator 10 | Easy to Use, Read, Extensible, Flexible Validation Checker. 11 | 12 | It can use without Rx. 13 | 14 | ## Requirements 15 | 16 | `RxValidator` is written in Swift 4. Compatible with iOS 8.0+ 17 | 18 | ## Installation 19 | 20 | ### CocoaPods 21 | 22 | RxValidator is available through [CocoaPods](http://cocoapods.org). To install 23 | it, simply add the following line to your Podfile: 24 | 25 | ```ruby 26 | pod 'RxValidator' 27 | ``` 28 | 29 | ## At a Glance 30 | You just use like this: 31 | ```swift 32 | 33 | //without Rx 34 | Validate.to(TargetValue) 35 | .validate(condition) 36 | ... 37 | .validate(condition) 38 | .asObservable() or .check() 39 | 40 | //with Rx 41 | observable 42 | .validate(condition) 43 | ... 44 | .validate(condition) 45 | .subscribe(...) 46 | 47 | ``` 48 | 49 | ## Usage 50 | 51 | ### String 52 | ```swift {.line-numbers} 53 | 54 | Validate.to("word is not empty") 55 | .validate(StringShouldNotBeEmpty()) 56 | .check() 57 | // result -> RxValidatorResult.valid 58 | 59 | //multiple condition 60 | Validate.to("vbmania@me.com") 61 | .validate(StringShouldNotBeEmpty()) 62 | .validate(StringIsNotOverflowThen(maxLength: 50)) 63 | .validate(StringShouldBeMatch("[a-z]+@[a-z]+\\.[a-z]+")) 64 | .check() 65 | // result -> RxValidatorResult.valid 66 | 67 | ``` 68 | 69 | ### Date 70 | ```swift {.line-numbers} 71 | 72 | let targetDate: Date //2018-05-05 73 | let sameTargetDate: Date 74 | let afterTargetDate: Date 75 | let beforeTargetDate: Date 76 | 77 | Validate.to(Date()) 78 | .validate(.shouldEqualTo(date: sameTargetDate)) //(1) 79 | .validate(.shouldAfterOrSameThen(date: sameTargetDate)) //(2) 80 | .validate(.shouldBeforeOrSameThen(date: sameTargetDate)) //(3) 81 | .validate(.shouldBeforeOrSameThen(date: afterTargetDate)) //(4) 82 | .validate(.shouldBeforeThen(date: afterTargetDate)) //(5) 83 | .validate(.shouldAfterOrSameThen(date: beforeTargetDate)) //(6) 84 | .validate(.shouldAfterThen(date: beforeTargetDate)) //(7) 85 | .check() 86 | 87 | // check() result 88 | 89 | // valid result -> RxValidatorResult.valid 90 | 91 | // (1) not valid -> RxValidatorResult.notEqualDate 92 | // (2) not valid -> RxValidatorResult.notAfterDate 93 | // (3) not valid -> RxValidatorResult.notBeforeDate 94 | // (4) not valid -> RxValidatorResult.notBeforeDate 95 | // (5) not valid -> RxValidatorResult.notBeforeDate 96 | // (6) not valid -> RxValidatorResult.notAfterDate 97 | // (7) not valid -> RxValidatorResult.notAfterDate 98 | 99 | ``` 100 | 101 | ### Int 102 | ```swift {.line-numbers} 103 | Validate.to(2) 104 | .validate(NumberShouldBeEven()) 105 | .check() 106 | //.valid 107 | 108 | Validate.to(1) 109 | .validate(NumberShouldBeEven()) 110 | .check() 111 | //.notEvenNumber 112 | ``` 113 | 114 | 115 | 116 | 117 | ## Working with RxSwift 118 | ### String 119 | ```swift {.line-numbers} 120 | 121 | Validate.to("word is not empty") 122 | .validate(StringShouldNotBeEmpty()) 123 | .asObservable() 124 | .subscribe(onNext: { value in 125 | print(value) 126 | //print("word is not empty") 127 | }) 128 | .disposed(by: disposeBag) 129 | 130 | Validate.to("word is not empty") 131 | .validate(StringShouldNotBeEmpty()) 132 | .asObservable() 133 | .map { $0 + "!!" } 134 | .bind(to: anotherObservableBinder) 135 | .disposed(by: disposeBag) 136 | 137 | 138 | //Multiple condition 139 | Validate.to("vbmania@me.com") 140 | .validate(StringShouldNotBeEmpty()) //(1) 141 | .validate(StringIsNotOverflowThen(maxLength: 50)) //(2) 142 | .validate(StringShouldBeMatch("[a-z]+@[a-z]+\\.[a-z]+")) //(3) 143 | .asObservable() 144 | .subscribe(onNext: { value in 145 | print(value) 146 | //print("vbmania@me.com") 147 | }, 148 | onError: { error in 149 | let validError = RxValidatorResult.determine(error: error) 150 | // (1) validError -> RxValidatorResult.stringIsEmpty 151 | // (2) validError -> RxValidatorResult.stringIsOverflow 152 | // (3) validError -> RxValidatorResult.stringIsNotMatch 153 | }) 154 | .disposed(by: disposeBag) 155 | 156 | ``` 157 | 158 | ### Int 159 | ```swift {.line-numbers} 160 | Validate.to(2) 161 | .validate(NumberShouldBeEven()) 162 | .asObservable() 163 | .subscribe(onNext: { value in 164 | print(value) 165 | //print(2) 166 | }) 167 | .disposed(by: disposeBag) 168 | 169 | Validate.to(1) 170 | .validate(NumberShouldBeEven()) 171 | .asObservable() 172 | .subscribe(onNext: { value in 173 | print(value) 174 | //print(1) 175 | }, 176 | onError: { error in 177 | let validError = RxValidatorResult.determine(error: error) 178 | //validError -> RxValidatorResult.notEvenNumber 179 | }) 180 | .disposed(by: disposeBag) 181 | 182 | ``` 183 | 184 | ### Date 185 | ```swift {.line-numbers} 186 | 187 | let targetDate: Date //2018-05-05 188 | let sameTargetDate: Date 189 | let afterTargetDate: Date 190 | let beforeTargetDate: Date 191 | 192 | Validate.to(Date()) 193 | .validate(.shouldEqualTo(date: sameTargetDate)) //(1) 194 | .validate(.shouldAfterOrSameThen(date: sameTargetDate)) //(2) 195 | .validate(.shouldBeforeOrSameThen(date: sameTargetDate)) //(3) 196 | .validate(.shouldBeforeOrSameThen(date: afterTargetDate)) //(4) 197 | .validate(.shouldBeforeThen(date: afterTargetDate)) //(5) 198 | .validate(.shouldAfterOrSameThen(date: beforeTargetDate)) //(6) 199 | .validate(.shouldAfterThen(date: beforeTargetDate)) //(7) 200 | .asObservable() 201 | .subscribe(onNext: { value in 202 | print(value) //print("2018-05-05") 203 | }, onError: { error in 204 | let validError = RxValidatorResult.determine(error: error) 205 | 206 | // (1) validError -> RxValidatorResult.notEqualDate 207 | // (2) validError -> RxValidatorResult.notAfterDate 208 | // (3) validError -> RxValidatorResult.notBeforeDate 209 | // (4) validError -> RxValidatorResult.notBeforeDate 210 | // (5) validError -> RxValidatorResult.notBeforeDate 211 | // (6) validError -> RxValidatorResult.notAfterDate 212 | // (7) validError -> RxValidatorResult.notAfterDate 213 | }) 214 | .disposed(by: disposeBag) 215 | 216 | ``` 217 | 218 | ### Chaining from Observable 219 | 220 | ```swift {.line-numbers} 221 | 222 | textField.rx.text 223 | .filterNil() 224 | .validate(StringIsAlwaysPass()) 225 | .subscribe(onNext: { (text) in 226 | print(text) 227 | }) 228 | .disposed(by: disposeBag) 229 | 230 | let text = PublishSubject() 231 | text 232 | .validate(StringIsAlwaysPass()) 233 | .subscribe(onNext: { (text) in 234 | print(text) 235 | }) 236 | .disposed(by: disposeBag) 237 | 238 | ``` 239 | 240 | ## Instant Condition Validation 241 | ```swift 242 | 243 | 244 | Validate.to("swift") 245 | .validate({ $0 == "objc" }) 246 | .check() 247 | 248 | Validate.to(7) 249 | .validate({ $0 > 10 }) 250 | .check() 251 | 252 | Validate.to(Date()) 253 | .validate({ !$0.isToday }) 254 | .check() 255 | 256 | 257 | Validate.to("swift") 258 | .validate({ $0 == "objc" }, message: "This is not swift") 259 | .check() 260 | 261 | Validate.to(7) 262 | .validate({ $0 > 10 }, message: "Number is too small.") 263 | .check() 264 | 265 | Validate.to(Date()) 266 | .validate({ !$0.isToday }, message: "It is today!!") 267 | .check() 268 | 269 | 270 | ``` 271 | 272 | 273 | ## ResultType 274 | ```swift {.line-numbers} 275 | enum RxValidatorResult 276 | 277 | case notValid 278 | case notValidWithMessage(message: String) 279 | case notValidWithCode(code: Int) 280 | 281 | case undefinedError 282 | 283 | case stringIsOverflow 284 | case stringIsEmpty 285 | case stringIsNotMatch 286 | 287 | case notEvenNumber 288 | 289 | case invalidateDateTerm 290 | case notBeforeDate 291 | case notAfterDate 292 | case notEqualDate 293 | ``` 294 | 295 | 296 | ## Working with ReactorKit (http://reactorkit.io) 297 | ```swift {.line-numbers} 298 | func mutate(action: Action) -> Observable { 299 | .... 300 | 301 | case let .changeTitle(title): 302 | return Validate.to(title) 303 | .validate(StringIsNotOverflowThen(maxLength: TITLE_MAX_LENGTH)) 304 | .asObservable() 305 | .flatMap { Observable.just(.updateTitle(title: $0)) } 306 | .catchError({ (error) -> Observable in 307 | let validError = ValidationTargetErrorType.determine(error: error) 308 | return Observable.just(.setTitleValidateError(validError, title)) 309 | }) 310 | 311 | .... 312 | 313 | ``` 314 | 315 | ## Supported Validation Rules 316 | ```swift 317 | //String 318 | StringShouldNotBeEmpty() 319 | StringIsNotOverflowThen(maxLength: Int) 320 | StringShouldBeMatch("regex string") 321 | 322 | //Int 323 | NumberShouldBeEven() 324 | 325 | //Date 326 | DateValidatorType.shouldEqualTo(Date) 327 | DateValidatorType.shouldBeforeThen(Date) 328 | DateValidatorType.shouldBeforeOrSameThen(Date) 329 | DateValidatorType.shouldAfterThen(Date) 330 | DateValidatorType.shouldAfterOrSameThen(Date) 331 | DateValidatorType.shouldBeCloseDates(date: Date, termOfDays: Int) 332 | 333 | ``` 334 | 335 | ## Make custom ValidationRule like this: 336 | ```swift 337 | //String Type 338 | class MyCustomStringValidationRule: StringValidatorType { 339 | func validate(_ value: String) throws { 340 | if {notValidCondition} { 341 | throw RxValidatorResult.notValidate(code: 999) //'code' must be defined your self. 342 | } 343 | } 344 | } 345 | 346 | 347 | //Int Type 348 | class MyCustomIntValidationRule: IntValidatorType { 349 | func validate(_ value: Int) throws { 350 | if {notValidCondition} { 351 | throw RxValidatorResult.notValidate(code: 999) //'code' must be defined your self. 352 | } 353 | } 354 | } 355 | 356 | 357 | ``` 358 | 359 | ## I want to be... 360 | * More Built-in Validation Rules. (Help me. Welcome to PR.) 361 | * Support More Type (Array, Float, Double, etc) 362 | * More Flexible Code via Generics. 363 | -------------------------------------------------------------------------------- /RxValidator.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |spec| 2 | spec.name = 'RxValidator' 3 | spec.version = '0.0.9' 4 | spec.summary = 'Simple, Extensable, Flexable Validation Checker' 5 | spec.homepage = 'https://github.com/vbmania/RxValidator' 6 | spec.license = { :type => 'MIT', :file => 'LICENSE' } 7 | spec.author = { 'GeumSang Yoo' => 'vbmania@me.com' } 8 | spec.source = { :git => 'https://github.com/vbmania/RxValidator.git', :tag => 'v' + spec.version.to_s } 9 | spec.source_files = 'Sources/**/*.swift' 10 | spec.frameworks = 'UIKit', 'Foundation' 11 | spec.requires_arc = true 12 | spec.swift_version = '4.1' 13 | 14 | spec.dependency 'RxSwift', '>= 4.1.0' 15 | spec.dependency 'RxCocoa', '>= 4.1.0' 16 | 17 | 18 | spec.ios.deployment_target = '8.0' 19 | spec.watchos.deployment_target = '2.0' 20 | spec.tvos.deployment_target = '9.0' 21 | 22 | end 23 | -------------------------------------------------------------------------------- /RxValidator.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1C5E775F869DF092EC93BEEF /* Pods_RxValidatorTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C056CEB2232AAC48DC2FAEAE /* Pods_RxValidatorTests.framework */; }; 11 | 9D1550D22167CE4900C5C889 /* RxValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D1550D02167CE4900C5C889 /* RxValidator.h */; settings = {ATTRIBUTES = (Public, ); }; }; 12 | 9D1550FE2167CEEC00C5C889 /* RxValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D1550D02167CE4900C5C889 /* RxValidator.h */; settings = {ATTRIBUTES = (Public, ); }; }; 13 | 9D1550FF2167CEF300C5C889 /* RxValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D1550D02167CE4900C5C889 /* RxValidator.h */; settings = {ATTRIBUTES = (Public, ); }; }; 14 | 9D1551002167CEF700C5C889 /* RxValidator.h in Headers */ = {isa = PBXBuildFile; fileRef = 9D1550D02167CE4900C5C889 /* RxValidator.h */; settings = {ATTRIBUTES = (Public, ); }; }; 15 | 9D53FC562167E1EE00BE3F59 /* Validate.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_8 /* Validate.swift */; }; 16 | 9D53FC572167E1EE00BE3F59 /* DateValidationTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_10 /* DateValidationTarget.swift */; }; 17 | 9D53FC582167E1EE00BE3F59 /* NumberValidationTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_11 /* NumberValidationTarget.swift */; }; 18 | 9D53FC592167E1EE00BE3F59 /* StringValidationTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_12 /* StringValidationTarget.swift */; }; 19 | 9D53FC5A2167E1EE00BE3F59 /* Observable+Date+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_14 /* Observable+Date+Extension.swift */; }; 20 | 9D53FC5B2167E1EE00BE3F59 /* Observable+Number+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_15 /* Observable+Number+Extension.swift */; }; 21 | 9D53FC5C2167E1EE00BE3F59 /* Observable+String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_16 /* Observable+String+Extension.swift */; }; 22 | 9D53FC5E2167E1EE00BE3F59 /* StringValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_19 /* StringValidator.swift */; }; 23 | 9D53FC5F2167E1EE00BE3F59 /* ValidationTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_20 /* ValidationTarget.swift */; }; 24 | 9D53FC602167E1EE00BE3F59 /* RxValidatorResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_22 /* RxValidatorResult.swift */; }; 25 | 9D53FC622167E1EE00BE3F59 /* IntShouldBeEven.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_27 /* IntShouldBeEven.swift */; }; 26 | 9D53FC642167E1EE00BE3F59 /* StringIsNotOverflowThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_30 /* StringIsNotOverflowThen.swift */; }; 27 | 9D53FC652167E1EE00BE3F59 /* StringShouldBeMatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_31 /* StringShouldBeMatch.swift */; }; 28 | 9D53FC662167E1EE00BE3F59 /* StringShouldNotBeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_32 /* StringShouldNotBeEmpty.swift */; }; 29 | 9D53FC672167E1F900BE3F59 /* Validate.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_8 /* Validate.swift */; }; 30 | 9D53FC682167E1F900BE3F59 /* DateValidationTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_10 /* DateValidationTarget.swift */; }; 31 | 9D53FC692167E1F900BE3F59 /* NumberValidationTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_11 /* NumberValidationTarget.swift */; }; 32 | 9D53FC6A2167E1F900BE3F59 /* StringValidationTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_12 /* StringValidationTarget.swift */; }; 33 | 9D53FC6B2167E1F900BE3F59 /* Observable+Date+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_14 /* Observable+Date+Extension.swift */; }; 34 | 9D53FC6C2167E1F900BE3F59 /* Observable+Number+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_15 /* Observable+Number+Extension.swift */; }; 35 | 9D53FC6D2167E1F900BE3F59 /* Observable+String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_16 /* Observable+String+Extension.swift */; }; 36 | 9D53FC6F2167E1F900BE3F59 /* StringValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_19 /* StringValidator.swift */; }; 37 | 9D53FC702167E1F900BE3F59 /* ValidationTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_20 /* ValidationTarget.swift */; }; 38 | 9D53FC712167E1F900BE3F59 /* RxValidatorResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_22 /* RxValidatorResult.swift */; }; 39 | 9D53FC732167E1F900BE3F59 /* IntShouldBeEven.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_27 /* IntShouldBeEven.swift */; }; 40 | 9D53FC752167E1F900BE3F59 /* StringIsNotOverflowThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_30 /* StringIsNotOverflowThen.swift */; }; 41 | 9D53FC762167E1F900BE3F59 /* StringShouldBeMatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_31 /* StringShouldBeMatch.swift */; }; 42 | 9D53FC772167E1F900BE3F59 /* StringShouldNotBeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_32 /* StringShouldNotBeEmpty.swift */; }; 43 | 9D53FC782167E1FF00BE3F59 /* Validate.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_8 /* Validate.swift */; }; 44 | 9D53FC792167E1FF00BE3F59 /* DateValidationTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_10 /* DateValidationTarget.swift */; }; 45 | 9D53FC7A2167E1FF00BE3F59 /* NumberValidationTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_11 /* NumberValidationTarget.swift */; }; 46 | 9D53FC7B2167E1FF00BE3F59 /* StringValidationTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_12 /* StringValidationTarget.swift */; }; 47 | 9D53FC7C2167E1FF00BE3F59 /* Observable+Date+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_14 /* Observable+Date+Extension.swift */; }; 48 | 9D53FC7D2167E1FF00BE3F59 /* Observable+Number+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_15 /* Observable+Number+Extension.swift */; }; 49 | 9D53FC7E2167E1FF00BE3F59 /* Observable+String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_16 /* Observable+String+Extension.swift */; }; 50 | 9D53FC802167E1FF00BE3F59 /* StringValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_19 /* StringValidator.swift */; }; 51 | 9D53FC812167E1FF00BE3F59 /* ValidationTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_20 /* ValidationTarget.swift */; }; 52 | 9D53FC822167E1FF00BE3F59 /* RxValidatorResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_22 /* RxValidatorResult.swift */; }; 53 | 9D53FC842167E1FF00BE3F59 /* IntShouldBeEven.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_27 /* IntShouldBeEven.swift */; }; 54 | 9D53FC862167E1FF00BE3F59 /* StringIsNotOverflowThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_30 /* StringIsNotOverflowThen.swift */; }; 55 | 9D53FC872167E1FF00BE3F59 /* StringShouldBeMatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_31 /* StringShouldBeMatch.swift */; }; 56 | 9D53FC882167E1FF00BE3F59 /* StringShouldNotBeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_32 /* StringShouldNotBeEmpty.swift */; }; 57 | 9D53FC892167E20400BE3F59 /* Validate.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_8 /* Validate.swift */; }; 58 | 9D53FC8A2167E20400BE3F59 /* DateValidationTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_10 /* DateValidationTarget.swift */; }; 59 | 9D53FC8B2167E20400BE3F59 /* NumberValidationTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_11 /* NumberValidationTarget.swift */; }; 60 | 9D53FC8C2167E20400BE3F59 /* StringValidationTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_12 /* StringValidationTarget.swift */; }; 61 | 9D53FC8D2167E20400BE3F59 /* Observable+Date+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_14 /* Observable+Date+Extension.swift */; }; 62 | 9D53FC8E2167E20400BE3F59 /* Observable+Number+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_15 /* Observable+Number+Extension.swift */; }; 63 | 9D53FC8F2167E20400BE3F59 /* Observable+String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_16 /* Observable+String+Extension.swift */; }; 64 | 9D53FC912167E20400BE3F59 /* StringValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_19 /* StringValidator.swift */; }; 65 | 9D53FC922167E20400BE3F59 /* ValidationTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_20 /* ValidationTarget.swift */; }; 66 | 9D53FC932167E20400BE3F59 /* RxValidatorResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_22 /* RxValidatorResult.swift */; }; 67 | 9D53FC952167E20400BE3F59 /* IntShouldBeEven.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_27 /* IntShouldBeEven.swift */; }; 68 | 9D53FC972167E20400BE3F59 /* StringIsNotOverflowThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_30 /* StringIsNotOverflowThen.swift */; }; 69 | 9D53FC982167E20400BE3F59 /* StringShouldBeMatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_31 /* StringShouldBeMatch.swift */; }; 70 | 9D53FC992167E20400BE3F59 /* StringShouldNotBeEmpty.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_32 /* StringShouldNotBeEmpty.swift */; }; 71 | 9D53FCA82167E2ED00BE3F59 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D53FCA72167E2ED00BE3F59 /* RxSwift.framework */; }; 72 | 9D53FCAA2167E2F200BE3F59 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D53FCA92167E2F200BE3F59 /* RxSwift.framework */; }; 73 | 9D53FCAC2167E2F600BE3F59 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D53FCAB2167E2F600BE3F59 /* RxSwift.framework */; }; 74 | 9D53FCAE2167E2FD00BE3F59 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D53FCAD2167E2FD00BE3F59 /* RxSwift.framework */; }; 75 | 9D53FCB72168C5FE00BE3F59 /* DateValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCB62168C5FE00BE3F59 /* DateValidator.swift */; }; 76 | 9D53FCB92168C64E00BE3F59 /* DateShouldEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCB82168C64E00BE3F59 /* DateShouldEqualTo.swift */; }; 77 | 9D53FCBB2168C71C00BE3F59 /* DateShouldBeforeThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCBA2168C71C00BE3F59 /* DateShouldBeforeThen.swift */; }; 78 | 9D53FCBD2168C79600BE3F59 /* DateShouldBeforeOrSameThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCBC2168C79600BE3F59 /* DateShouldBeforeOrSameThen.swift */; }; 79 | 9D53FCBF2168C7EC00BE3F59 /* DateShouldAfterThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCBE2168C7EC00BE3F59 /* DateShouldAfterThen.swift */; }; 80 | 9D53FCC12168C84A00BE3F59 /* DateShouldAfterOrSameThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCC02168C84A00BE3F59 /* DateShouldAfterOrSameThen.swift */; }; 81 | 9D53FCC32168C8A300BE3F59 /* DateShouldBeCloseDates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCC22168C8A300BE3F59 /* DateShouldBeCloseDates.swift */; }; 82 | 9D53FCC52168C9F200BE3F59 /* StringIsNotUnderflowThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCC42168C9F200BE3F59 /* StringIsNotUnderflowThen.swift */; }; 83 | 9D53FCC72168CA7B00BE3F59 /* StringShouldEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCC62168CA7B00BE3F59 /* StringShouldEqualTo.swift */; }; 84 | 9D53FCC92168CB9000BE3F59 /* NumberValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCC82168CB9000BE3F59 /* NumberValidator.swift */; }; 85 | 9D53FCCD2168CBD400BE3F59 /* NumberShouldEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCCC2168CBD400BE3F59 /* NumberShouldEqualTo.swift */; }; 86 | 9D53FCCE2168CBD400BE3F59 /* NumberShouldEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCCC2168CBD400BE3F59 /* NumberShouldEqualTo.swift */; }; 87 | 9D53FCCF2168CBD400BE3F59 /* NumberShouldEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCCC2168CBD400BE3F59 /* NumberShouldEqualTo.swift */; }; 88 | 9D53FCD02168CBD400BE3F59 /* NumberShouldEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCCC2168CBD400BE3F59 /* NumberShouldEqualTo.swift */; }; 89 | 9D53FCD22168CDEB00BE3F59 /* NumberShouldLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCD12168CDEB00BE3F59 /* NumberShouldLessThan.swift */; }; 90 | 9D53FCD32168CDEB00BE3F59 /* NumberShouldLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCD12168CDEB00BE3F59 /* NumberShouldLessThan.swift */; }; 91 | 9D53FCD42168CDEB00BE3F59 /* NumberShouldLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCD12168CDEB00BE3F59 /* NumberShouldLessThan.swift */; }; 92 | 9D53FCD52168CDEB00BE3F59 /* NumberShouldLessThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCD12168CDEB00BE3F59 /* NumberShouldLessThan.swift */; }; 93 | 9D53FCD72168CF4100BE3F59 /* NumberShouldGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCD62168CF4100BE3F59 /* NumberShouldGreaterThan.swift */; }; 94 | 9D53FCD82168CF4100BE3F59 /* NumberShouldGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCD62168CF4100BE3F59 /* NumberShouldGreaterThan.swift */; }; 95 | 9D53FCD92168CF4100BE3F59 /* NumberShouldGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCD62168CF4100BE3F59 /* NumberShouldGreaterThan.swift */; }; 96 | 9D53FCDA2168CF4100BE3F59 /* NumberShouldGreaterThan.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCD62168CF4100BE3F59 /* NumberShouldGreaterThan.swift */; }; 97 | 9D53FCDB2168CF6A00BE3F59 /* NumberValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCC82168CB9000BE3F59 /* NumberValidator.swift */; }; 98 | 9D53FCDC2168CF6A00BE3F59 /* DateValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCB62168C5FE00BE3F59 /* DateValidator.swift */; }; 99 | 9D53FCDD2168CF6A00BE3F59 /* DateShouldEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCB82168C64E00BE3F59 /* DateShouldEqualTo.swift */; }; 100 | 9D53FCDE2168CF6A00BE3F59 /* DateShouldBeforeThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCBA2168C71C00BE3F59 /* DateShouldBeforeThen.swift */; }; 101 | 9D53FCDF2168CF6A00BE3F59 /* DateShouldBeforeOrSameThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCBC2168C79600BE3F59 /* DateShouldBeforeOrSameThen.swift */; }; 102 | 9D53FCE02168CF6A00BE3F59 /* DateShouldAfterThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCBE2168C7EC00BE3F59 /* DateShouldAfterThen.swift */; }; 103 | 9D53FCE12168CF6A00BE3F59 /* DateShouldAfterOrSameThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCC02168C84A00BE3F59 /* DateShouldAfterOrSameThen.swift */; }; 104 | 9D53FCE22168CF6A00BE3F59 /* DateShouldBeCloseDates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCC22168C8A300BE3F59 /* DateShouldBeCloseDates.swift */; }; 105 | 9D53FCE32168CF6A00BE3F59 /* StringIsNotUnderflowThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCC42168C9F200BE3F59 /* StringIsNotUnderflowThen.swift */; }; 106 | 9D53FCE42168CF6A00BE3F59 /* StringShouldEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCC62168CA7B00BE3F59 /* StringShouldEqualTo.swift */; }; 107 | 9D53FCE52168CF7300BE3F59 /* NumberValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCC82168CB9000BE3F59 /* NumberValidator.swift */; }; 108 | 9D53FCE62168CF7300BE3F59 /* DateValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCB62168C5FE00BE3F59 /* DateValidator.swift */; }; 109 | 9D53FCE72168CF7300BE3F59 /* DateShouldEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCB82168C64E00BE3F59 /* DateShouldEqualTo.swift */; }; 110 | 9D53FCE82168CF7300BE3F59 /* DateShouldBeforeThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCBA2168C71C00BE3F59 /* DateShouldBeforeThen.swift */; }; 111 | 9D53FCE92168CF7300BE3F59 /* DateShouldBeforeOrSameThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCBC2168C79600BE3F59 /* DateShouldBeforeOrSameThen.swift */; }; 112 | 9D53FCEA2168CF7300BE3F59 /* DateShouldAfterThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCBE2168C7EC00BE3F59 /* DateShouldAfterThen.swift */; }; 113 | 9D53FCEB2168CF7300BE3F59 /* DateShouldAfterOrSameThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCC02168C84A00BE3F59 /* DateShouldAfterOrSameThen.swift */; }; 114 | 9D53FCEC2168CF7300BE3F59 /* DateShouldBeCloseDates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCC22168C8A300BE3F59 /* DateShouldBeCloseDates.swift */; }; 115 | 9D53FCED2168CF7300BE3F59 /* StringIsNotUnderflowThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCC42168C9F200BE3F59 /* StringIsNotUnderflowThen.swift */; }; 116 | 9D53FCEE2168CF7300BE3F59 /* StringShouldEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCC62168CA7B00BE3F59 /* StringShouldEqualTo.swift */; }; 117 | 9D53FCEF2168CF7A00BE3F59 /* NumberValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCC82168CB9000BE3F59 /* NumberValidator.swift */; }; 118 | 9D53FCF02168CF7A00BE3F59 /* DateValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCB62168C5FE00BE3F59 /* DateValidator.swift */; }; 119 | 9D53FCF12168CF7A00BE3F59 /* DateShouldEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCB82168C64E00BE3F59 /* DateShouldEqualTo.swift */; }; 120 | 9D53FCF22168CF7A00BE3F59 /* DateShouldBeforeThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCBA2168C71C00BE3F59 /* DateShouldBeforeThen.swift */; }; 121 | 9D53FCF32168CF7A00BE3F59 /* DateShouldBeforeOrSameThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCBC2168C79600BE3F59 /* DateShouldBeforeOrSameThen.swift */; }; 122 | 9D53FCF42168CF7A00BE3F59 /* DateShouldAfterThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCBE2168C7EC00BE3F59 /* DateShouldAfterThen.swift */; }; 123 | 9D53FCF52168CF7A00BE3F59 /* DateShouldAfterOrSameThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCC02168C84A00BE3F59 /* DateShouldAfterOrSameThen.swift */; }; 124 | 9D53FCF62168CF7A00BE3F59 /* DateShouldBeCloseDates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCC22168C8A300BE3F59 /* DateShouldBeCloseDates.swift */; }; 125 | 9D53FCF72168CF7A00BE3F59 /* StringIsNotUnderflowThen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCC42168C9F200BE3F59 /* StringIsNotUnderflowThen.swift */; }; 126 | 9D53FCF82168CF7A00BE3F59 /* StringShouldEqualTo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FCC62168CA7B00BE3F59 /* StringShouldEqualTo.swift */; }; 127 | 9D53FD022168CFDB00BE3F59 /* RxValidator.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D1550CE2167CE4900C5C889 /* RxValidator.framework */; }; 128 | 9D53FD112168D03200BE3F59 /* AlwaysFailingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FD092168D03200BE3F59 /* AlwaysFailingTests.swift */; }; 129 | 9D53FD122168D03200BE3F59 /* InstantValidateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FD0A2168D03200BE3F59 /* InstantValidateTests.swift */; }; 130 | 9D53FD132168D03200BE3F59 /* DateValidateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FD0B2168D03200BE3F59 /* DateValidateTests.swift */; }; 131 | 9D53FD142168D03200BE3F59 /* RxValidatorResultTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FD0C2168D03200BE3F59 /* RxValidatorResultTests.swift */; }; 132 | 9D53FD152168D03200BE3F59 /* StringValidateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FD0D2168D03200BE3F59 /* StringValidateTests.swift */; }; 133 | 9D53FD162168D03200BE3F59 /* ObservableExtensionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FD0E2168D03200BE3F59 /* ObservableExtensionTests.swift */; }; 134 | 9D53FD172168D03200BE3F59 /* NumberValidateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FD0F2168D03200BE3F59 /* NumberValidateTests.swift */; }; 135 | 9D53FD182168D03200BE3F59 /* StringValidateRegexTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FD102168D03200BE3F59 /* StringValidateRegexTests.swift */; }; 136 | 9D53FD4C2168D42500BE3F59 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9D53FD422168D42500BE3F59 /* Assets.xcassets */; }; 137 | 9D53FD4D2168D42500BE3F59 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9D53FD432168D42500BE3F59 /* LaunchScreen.storyboard */; }; 138 | 9D53FD4E2168D42500BE3F59 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9D53FD452168D42500BE3F59 /* Main.storyboard */; }; 139 | 9D53FD502168D42500BE3F59 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FD4A2168D42500BE3F59 /* ViewController.swift */; }; 140 | 9D53FD512168D42500BE3F59 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FD4B2168D42500BE3F59 /* AppDelegate.swift */; }; 141 | 9D53FD552168D68700BE3F59 /* ValidationWithRxSwiftTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FD542168D68700BE3F59 /* ValidationWithRxSwiftTests.swift */; }; 142 | 9D53FD572168E24400BE3F59 /* StringIsAlwaysPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FD562168E24400BE3F59 /* StringIsAlwaysPass.swift */; }; 143 | 9D53FD582168E24400BE3F59 /* StringIsAlwaysPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FD562168E24400BE3F59 /* StringIsAlwaysPass.swift */; }; 144 | 9D53FD592168E24400BE3F59 /* StringIsAlwaysPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FD562168E24400BE3F59 /* StringIsAlwaysPass.swift */; }; 145 | 9D53FD5A2168E24400BE3F59 /* StringIsAlwaysPass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D53FD562168E24400BE3F59 /* StringIsAlwaysPass.swift */; }; 146 | /* End PBXBuildFile section */ 147 | 148 | /* Begin PBXContainerItemProxy section */ 149 | 9D53FD032168CFDB00BE3F59 /* PBXContainerItemProxy */ = { 150 | isa = PBXContainerItemProxy; 151 | containerPortal = OBJ_1 /* Project object */; 152 | proxyType = 1; 153 | remoteGlobalIDString = 9D1550CD2167CE4900C5C889; 154 | remoteInfo = "RxValidator iOS"; 155 | }; 156 | 9D53FD3E2168D3F500BE3F59 /* PBXContainerItemProxy */ = { 157 | isa = PBXContainerItemProxy; 158 | containerPortal = OBJ_1 /* Project object */; 159 | proxyType = 1; 160 | remoteGlobalIDString = 9D53FD2B2168D3E500BE3F59; 161 | remoteInfo = "RxValidatorTests Host"; 162 | }; 163 | /* End PBXContainerItemProxy section */ 164 | 165 | /* Begin PBXFileReference section */ 166 | 4C33D050AAC5280503861BA4 /* Pods-RxValidatorTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RxValidatorTests.release.xcconfig"; path = "Target Support Files/Pods-RxValidatorTests/Pods-RxValidatorTests.release.xcconfig"; sourceTree = ""; }; 167 | 9D1550CE2167CE4900C5C889 /* RxValidator.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxValidator.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 168 | 9D1550D02167CE4900C5C889 /* RxValidator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RxValidator.h; sourceTree = ""; }; 169 | 9D1550D12167CE4900C5C889 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 170 | 9D1550DB2167CE6C00C5C889 /* RxValidator.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxValidator.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 171 | 9D1550E82167CE7800C5C889 /* RxValidator.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxValidator.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 172 | 9D1550F52167CE9100C5C889 /* RxValidator.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxValidator.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 173 | 9D53FCA72167E2ED00BE3F59 /* RxSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxSwift.framework; path = Carthage/Build/Mac/RxSwift.framework; sourceTree = ""; }; 174 | 9D53FCA92167E2F200BE3F59 /* RxSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxSwift.framework; path = Carthage/Build/tvOS/RxSwift.framework; sourceTree = ""; }; 175 | 9D53FCAB2167E2F600BE3F59 /* RxSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxSwift.framework; path = Carthage/Build/watchOS/RxSwift.framework; sourceTree = ""; }; 176 | 9D53FCAD2167E2FD00BE3F59 /* RxSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxSwift.framework; path = Carthage/Build/iOS/RxSwift.framework; sourceTree = ""; }; 177 | 9D53FCB62168C5FE00BE3F59 /* DateValidator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateValidator.swift; sourceTree = ""; }; 178 | 9D53FCB82168C64E00BE3F59 /* DateShouldEqualTo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateShouldEqualTo.swift; sourceTree = ""; }; 179 | 9D53FCBA2168C71C00BE3F59 /* DateShouldBeforeThen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateShouldBeforeThen.swift; sourceTree = ""; }; 180 | 9D53FCBC2168C79600BE3F59 /* DateShouldBeforeOrSameThen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateShouldBeforeOrSameThen.swift; sourceTree = ""; }; 181 | 9D53FCBE2168C7EC00BE3F59 /* DateShouldAfterThen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateShouldAfterThen.swift; sourceTree = ""; }; 182 | 9D53FCC02168C84A00BE3F59 /* DateShouldAfterOrSameThen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateShouldAfterOrSameThen.swift; sourceTree = ""; }; 183 | 9D53FCC22168C8A300BE3F59 /* DateShouldBeCloseDates.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateShouldBeCloseDates.swift; sourceTree = ""; }; 184 | 9D53FCC42168C9F200BE3F59 /* StringIsNotUnderflowThen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringIsNotUnderflowThen.swift; sourceTree = ""; }; 185 | 9D53FCC62168CA7B00BE3F59 /* StringShouldEqualTo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringShouldEqualTo.swift; sourceTree = ""; }; 186 | 9D53FCC82168CB9000BE3F59 /* NumberValidator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NumberValidator.swift; sourceTree = ""; }; 187 | 9D53FCCC2168CBD400BE3F59 /* NumberShouldEqualTo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NumberShouldEqualTo.swift; sourceTree = ""; }; 188 | 9D53FCD12168CDEB00BE3F59 /* NumberShouldLessThan.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NumberShouldLessThan.swift; sourceTree = ""; }; 189 | 9D53FCD62168CF4100BE3F59 /* NumberShouldGreaterThan.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NumberShouldGreaterThan.swift; sourceTree = ""; }; 190 | 9D53FCFD2168CFDB00BE3F59 /* RxValidatorTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RxValidatorTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 191 | 9D53FD092168D03200BE3F59 /* AlwaysFailingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AlwaysFailingTests.swift; sourceTree = ""; }; 192 | 9D53FD0A2168D03200BE3F59 /* InstantValidateTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InstantValidateTests.swift; sourceTree = ""; }; 193 | 9D53FD0B2168D03200BE3F59 /* DateValidateTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DateValidateTests.swift; sourceTree = ""; }; 194 | 9D53FD0C2168D03200BE3F59 /* RxValidatorResultTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxValidatorResultTests.swift; sourceTree = ""; }; 195 | 9D53FD0D2168D03200BE3F59 /* StringValidateTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringValidateTests.swift; sourceTree = ""; }; 196 | 9D53FD0E2168D03200BE3F59 /* ObservableExtensionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ObservableExtensionTests.swift; sourceTree = ""; }; 197 | 9D53FD0F2168D03200BE3F59 /* NumberValidateTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NumberValidateTests.swift; sourceTree = ""; }; 198 | 9D53FD102168D03200BE3F59 /* StringValidateRegexTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringValidateRegexTests.swift; sourceTree = ""; }; 199 | 9D53FD2C2168D3E500BE3F59 /* RxValidatorTests Host.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "RxValidatorTests Host.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 200 | 9D53FD422168D42500BE3F59 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 201 | 9D53FD442168D42500BE3F59 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 202 | 9D53FD462168D42500BE3F59 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 203 | 9D53FD482168D42500BE3F59 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 204 | 9D53FD4A2168D42500BE3F59 /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 205 | 9D53FD4B2168D42500BE3F59 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 206 | 9D53FD542168D68700BE3F59 /* ValidationWithRxSwiftTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValidationWithRxSwiftTests.swift; sourceTree = ""; }; 207 | 9D53FD562168E24400BE3F59 /* StringIsAlwaysPass.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringIsAlwaysPass.swift; sourceTree = ""; }; 208 | BE9974B928363AAF2148B96F /* Pods-RxValidatorTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RxValidatorTests.debug.xcconfig"; path = "Target Support Files/Pods-RxValidatorTests/Pods-RxValidatorTests.debug.xcconfig"; sourceTree = ""; }; 209 | C056CEB2232AAC48DC2FAEAE /* Pods_RxValidatorTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RxValidatorTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 210 | OBJ_10 /* DateValidationTarget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateValidationTarget.swift; sourceTree = ""; }; 211 | OBJ_11 /* NumberValidationTarget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NumberValidationTarget.swift; sourceTree = ""; }; 212 | OBJ_12 /* StringValidationTarget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringValidationTarget.swift; sourceTree = ""; }; 213 | OBJ_14 /* Observable+Date+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Observable+Date+Extension.swift"; sourceTree = ""; }; 214 | OBJ_15 /* Observable+Number+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Observable+Number+Extension.swift"; sourceTree = ""; }; 215 | OBJ_16 /* Observable+String+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Observable+String+Extension.swift"; sourceTree = ""; }; 216 | OBJ_19 /* StringValidator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringValidator.swift; sourceTree = ""; }; 217 | OBJ_20 /* ValidationTarget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ValidationTarget.swift; sourceTree = ""; }; 218 | OBJ_22 /* RxValidatorResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RxValidatorResult.swift; sourceTree = ""; }; 219 | OBJ_27 /* IntShouldBeEven.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntShouldBeEven.swift; sourceTree = ""; }; 220 | OBJ_30 /* StringIsNotOverflowThen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringIsNotOverflowThen.swift; sourceTree = ""; }; 221 | OBJ_31 /* StringShouldBeMatch.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringShouldBeMatch.swift; sourceTree = ""; }; 222 | OBJ_32 /* StringShouldNotBeEmpty.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringShouldNotBeEmpty.swift; sourceTree = ""; }; 223 | OBJ_8 /* Validate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Validate.swift; sourceTree = ""; }; 224 | /* End PBXFileReference section */ 225 | 226 | /* Begin PBXFrameworksBuildPhase section */ 227 | 9D1550CB2167CE4900C5C889 /* Frameworks */ = { 228 | isa = PBXFrameworksBuildPhase; 229 | buildActionMask = 2147483647; 230 | files = ( 231 | 9D53FCAE2167E2FD00BE3F59 /* RxSwift.framework in Frameworks */, 232 | ); 233 | runOnlyForDeploymentPostprocessing = 0; 234 | }; 235 | 9D1550D82167CE6C00C5C889 /* Frameworks */ = { 236 | isa = PBXFrameworksBuildPhase; 237 | buildActionMask = 2147483647; 238 | files = ( 239 | 9D53FCAC2167E2F600BE3F59 /* RxSwift.framework in Frameworks */, 240 | ); 241 | runOnlyForDeploymentPostprocessing = 0; 242 | }; 243 | 9D1550E52167CE7800C5C889 /* Frameworks */ = { 244 | isa = PBXFrameworksBuildPhase; 245 | buildActionMask = 2147483647; 246 | files = ( 247 | 9D53FCAA2167E2F200BE3F59 /* RxSwift.framework in Frameworks */, 248 | ); 249 | runOnlyForDeploymentPostprocessing = 0; 250 | }; 251 | 9D1550F22167CE9100C5C889 /* Frameworks */ = { 252 | isa = PBXFrameworksBuildPhase; 253 | buildActionMask = 2147483647; 254 | files = ( 255 | 9D53FCA82167E2ED00BE3F59 /* RxSwift.framework in Frameworks */, 256 | ); 257 | runOnlyForDeploymentPostprocessing = 0; 258 | }; 259 | 9D53FCFA2168CFDB00BE3F59 /* Frameworks */ = { 260 | isa = PBXFrameworksBuildPhase; 261 | buildActionMask = 2147483647; 262 | files = ( 263 | 9D53FD022168CFDB00BE3F59 /* RxValidator.framework in Frameworks */, 264 | 1C5E775F869DF092EC93BEEF /* Pods_RxValidatorTests.framework in Frameworks */, 265 | ); 266 | runOnlyForDeploymentPostprocessing = 0; 267 | }; 268 | 9D53FD292168D3E500BE3F59 /* Frameworks */ = { 269 | isa = PBXFrameworksBuildPhase; 270 | buildActionMask = 2147483647; 271 | files = ( 272 | ); 273 | runOnlyForDeploymentPostprocessing = 0; 274 | }; 275 | /* End PBXFrameworksBuildPhase section */ 276 | 277 | /* Begin PBXGroup section */ 278 | 5C36D42EE02B8A527B61D116 /* Pods */ = { 279 | isa = PBXGroup; 280 | children = ( 281 | BE9974B928363AAF2148B96F /* Pods-RxValidatorTests.debug.xcconfig */, 282 | 4C33D050AAC5280503861BA4 /* Pods-RxValidatorTests.release.xcconfig */, 283 | ); 284 | path = Pods; 285 | sourceTree = ""; 286 | }; 287 | 9D1550FD2167CEA900C5C889 /* Supporting Files */ = { 288 | isa = PBXGroup; 289 | children = ( 290 | 9D1550D02167CE4900C5C889 /* RxValidator.h */, 291 | 9D1550D12167CE4900C5C889 /* Info.plist */, 292 | ); 293 | path = "Supporting Files"; 294 | sourceTree = ""; 295 | }; 296 | 9D53FC3D2167CFDD00BE3F59 /* Frameworks */ = { 297 | isa = PBXGroup; 298 | children = ( 299 | 9D53FCAD2167E2FD00BE3F59 /* RxSwift.framework */, 300 | 9D53FCAB2167E2F600BE3F59 /* RxSwift.framework */, 301 | 9D53FCA92167E2F200BE3F59 /* RxSwift.framework */, 302 | 9D53FCA72167E2ED00BE3F59 /* RxSwift.framework */, 303 | C056CEB2232AAC48DC2FAEAE /* Pods_RxValidatorTests.framework */, 304 | ); 305 | name = Frameworks; 306 | sourceTree = ""; 307 | }; 308 | 9D53FCCB2168CBCC00BE3F59 /* Number */ = { 309 | isa = PBXGroup; 310 | children = ( 311 | 9D53FCCC2168CBD400BE3F59 /* NumberShouldEqualTo.swift */, 312 | 9D53FCD12168CDEB00BE3F59 /* NumberShouldLessThan.swift */, 313 | 9D53FCD62168CF4100BE3F59 /* NumberShouldGreaterThan.swift */, 314 | OBJ_27 /* IntShouldBeEven.swift */, 315 | ); 316 | path = Number; 317 | sourceTree = ""; 318 | }; 319 | 9D53FD082168D03200BE3F59 /* Tests */ = { 320 | isa = PBXGroup; 321 | children = ( 322 | 9D53FD092168D03200BE3F59 /* AlwaysFailingTests.swift */, 323 | 9D53FD0A2168D03200BE3F59 /* InstantValidateTests.swift */, 324 | 9D53FD0B2168D03200BE3F59 /* DateValidateTests.swift */, 325 | 9D53FD0C2168D03200BE3F59 /* RxValidatorResultTests.swift */, 326 | 9D53FD0D2168D03200BE3F59 /* StringValidateTests.swift */, 327 | 9D53FD0E2168D03200BE3F59 /* ObservableExtensionTests.swift */, 328 | 9D53FD0F2168D03200BE3F59 /* NumberValidateTests.swift */, 329 | 9D53FD102168D03200BE3F59 /* StringValidateRegexTests.swift */, 330 | 9D53FD542168D68700BE3F59 /* ValidationWithRxSwiftTests.swift */, 331 | ); 332 | path = Tests; 333 | sourceTree = ""; 334 | }; 335 | 9D53FD402168D42500BE3F59 /* Tests Host */ = { 336 | isa = PBXGroup; 337 | children = ( 338 | 9D53FD412168D42500BE3F59 /* Resources */, 339 | 9D53FD472168D42500BE3F59 /* Supporting Files */, 340 | 9D53FD492168D42500BE3F59 /* Sources */, 341 | ); 342 | path = "Tests Host"; 343 | sourceTree = ""; 344 | }; 345 | 9D53FD412168D42500BE3F59 /* Resources */ = { 346 | isa = PBXGroup; 347 | children = ( 348 | 9D53FD422168D42500BE3F59 /* Assets.xcassets */, 349 | 9D53FD432168D42500BE3F59 /* LaunchScreen.storyboard */, 350 | 9D53FD452168D42500BE3F59 /* Main.storyboard */, 351 | ); 352 | path = Resources; 353 | sourceTree = ""; 354 | }; 355 | 9D53FD472168D42500BE3F59 /* Supporting Files */ = { 356 | isa = PBXGroup; 357 | children = ( 358 | 9D53FD482168D42500BE3F59 /* Info.plist */, 359 | ); 360 | path = "Supporting Files"; 361 | sourceTree = ""; 362 | }; 363 | 9D53FD492168D42500BE3F59 /* Sources */ = { 364 | isa = PBXGroup; 365 | children = ( 366 | 9D53FD4A2168D42500BE3F59 /* ViewController.swift */, 367 | 9D53FD4B2168D42500BE3F59 /* AppDelegate.swift */, 368 | ); 369 | path = Sources; 370 | sourceTree = ""; 371 | }; 372 | OBJ_13 /* extensions */ = { 373 | isa = PBXGroup; 374 | children = ( 375 | OBJ_14 /* Observable+Date+Extension.swift */, 376 | OBJ_15 /* Observable+Number+Extension.swift */, 377 | OBJ_16 /* Observable+String+Extension.swift */, 378 | ); 379 | path = extensions; 380 | sourceTree = ""; 381 | }; 382 | OBJ_17 /* protocols */ = { 383 | isa = PBXGroup; 384 | children = ( 385 | OBJ_20 /* ValidationTarget.swift */, 386 | ); 387 | path = protocols; 388 | sourceTree = ""; 389 | }; 390 | OBJ_21 /* result */ = { 391 | isa = PBXGroup; 392 | children = ( 393 | OBJ_22 /* RxValidatorResult.swift */, 394 | ); 395 | path = result; 396 | sourceTree = ""; 397 | }; 398 | OBJ_23 /* rules */ = { 399 | isa = PBXGroup; 400 | children = ( 401 | 9D53FCC82168CB9000BE3F59 /* NumberValidator.swift */, 402 | OBJ_19 /* StringValidator.swift */, 403 | 9D53FCB62168C5FE00BE3F59 /* DateValidator.swift */, 404 | OBJ_24 /* Date */, 405 | 9D53FCCB2168CBCC00BE3F59 /* Number */, 406 | OBJ_28 /* String */, 407 | ); 408 | path = rules; 409 | sourceTree = ""; 410 | }; 411 | OBJ_24 /* Date */ = { 412 | isa = PBXGroup; 413 | children = ( 414 | 9D53FCB82168C64E00BE3F59 /* DateShouldEqualTo.swift */, 415 | 9D53FCBA2168C71C00BE3F59 /* DateShouldBeforeThen.swift */, 416 | 9D53FCBC2168C79600BE3F59 /* DateShouldBeforeOrSameThen.swift */, 417 | 9D53FCBE2168C7EC00BE3F59 /* DateShouldAfterThen.swift */, 418 | 9D53FCC02168C84A00BE3F59 /* DateShouldAfterOrSameThen.swift */, 419 | 9D53FCC22168C8A300BE3F59 /* DateShouldBeCloseDates.swift */, 420 | ); 421 | path = Date; 422 | sourceTree = ""; 423 | }; 424 | OBJ_28 /* String */ = { 425 | isa = PBXGroup; 426 | children = ( 427 | 9D53FD562168E24400BE3F59 /* StringIsAlwaysPass.swift */, 428 | 9D53FCC42168C9F200BE3F59 /* StringIsNotUnderflowThen.swift */, 429 | OBJ_30 /* StringIsNotOverflowThen.swift */, 430 | OBJ_31 /* StringShouldBeMatch.swift */, 431 | OBJ_32 /* StringShouldNotBeEmpty.swift */, 432 | 9D53FCC62168CA7B00BE3F59 /* StringShouldEqualTo.swift */, 433 | ); 434 | path = String; 435 | sourceTree = ""; 436 | }; 437 | OBJ_5 = { 438 | isa = PBXGroup; 439 | children = ( 440 | OBJ_7 /* Sources */, 441 | 9D53FD082168D03200BE3F59 /* Tests */, 442 | 9D53FD402168D42500BE3F59 /* Tests Host */, 443 | 9D1550FD2167CEA900C5C889 /* Supporting Files */, 444 | OBJ_577 /* Products */, 445 | 9D53FC3D2167CFDD00BE3F59 /* Frameworks */, 446 | 5C36D42EE02B8A527B61D116 /* Pods */, 447 | ); 448 | sourceTree = ""; 449 | }; 450 | OBJ_577 /* Products */ = { 451 | isa = PBXGroup; 452 | children = ( 453 | 9D1550CE2167CE4900C5C889 /* RxValidator.framework */, 454 | 9D1550DB2167CE6C00C5C889 /* RxValidator.framework */, 455 | 9D1550E82167CE7800C5C889 /* RxValidator.framework */, 456 | 9D1550F52167CE9100C5C889 /* RxValidator.framework */, 457 | 9D53FCFD2168CFDB00BE3F59 /* RxValidatorTests.xctest */, 458 | 9D53FD2C2168D3E500BE3F59 /* RxValidatorTests Host.app */, 459 | ); 460 | name = Products; 461 | sourceTree = BUILT_PRODUCTS_DIR; 462 | }; 463 | OBJ_7 /* Sources */ = { 464 | isa = PBXGroup; 465 | children = ( 466 | OBJ_8 /* Validate.swift */, 467 | OBJ_9 /* ValidationTarget */, 468 | OBJ_13 /* extensions */, 469 | OBJ_17 /* protocols */, 470 | OBJ_21 /* result */, 471 | OBJ_23 /* rules */, 472 | ); 473 | path = Sources; 474 | sourceTree = SOURCE_ROOT; 475 | }; 476 | OBJ_9 /* ValidationTarget */ = { 477 | isa = PBXGroup; 478 | children = ( 479 | OBJ_10 /* DateValidationTarget.swift */, 480 | OBJ_11 /* NumberValidationTarget.swift */, 481 | OBJ_12 /* StringValidationTarget.swift */, 482 | ); 483 | path = ValidationTarget; 484 | sourceTree = ""; 485 | }; 486 | /* End PBXGroup section */ 487 | 488 | /* Begin PBXHeadersBuildPhase section */ 489 | 9D1550C92167CE4900C5C889 /* Headers */ = { 490 | isa = PBXHeadersBuildPhase; 491 | buildActionMask = 2147483647; 492 | files = ( 493 | 9D1550D22167CE4900C5C889 /* RxValidator.h in Headers */, 494 | ); 495 | runOnlyForDeploymentPostprocessing = 0; 496 | }; 497 | 9D1550D62167CE6C00C5C889 /* Headers */ = { 498 | isa = PBXHeadersBuildPhase; 499 | buildActionMask = 2147483647; 500 | files = ( 501 | 9D1550FE2167CEEC00C5C889 /* RxValidator.h in Headers */, 502 | ); 503 | runOnlyForDeploymentPostprocessing = 0; 504 | }; 505 | 9D1550E32167CE7800C5C889 /* Headers */ = { 506 | isa = PBXHeadersBuildPhase; 507 | buildActionMask = 2147483647; 508 | files = ( 509 | 9D1550FF2167CEF300C5C889 /* RxValidator.h in Headers */, 510 | ); 511 | runOnlyForDeploymentPostprocessing = 0; 512 | }; 513 | 9D1550F02167CE9100C5C889 /* Headers */ = { 514 | isa = PBXHeadersBuildPhase; 515 | buildActionMask = 2147483647; 516 | files = ( 517 | 9D1551002167CEF700C5C889 /* RxValidator.h in Headers */, 518 | ); 519 | runOnlyForDeploymentPostprocessing = 0; 520 | }; 521 | /* End PBXHeadersBuildPhase section */ 522 | 523 | /* Begin PBXNativeTarget section */ 524 | 9D1550CD2167CE4900C5C889 /* RxValidator iOS */ = { 525 | isa = PBXNativeTarget; 526 | buildConfigurationList = 9D1550D32167CE4900C5C889 /* Build configuration list for PBXNativeTarget "RxValidator iOS" */; 527 | buildPhases = ( 528 | 9D1550C92167CE4900C5C889 /* Headers */, 529 | 9D1550CA2167CE4900C5C889 /* Sources */, 530 | 9D1550CB2167CE4900C5C889 /* Frameworks */, 531 | 9D1550CC2167CE4900C5C889 /* Resources */, 532 | ); 533 | buildRules = ( 534 | ); 535 | dependencies = ( 536 | ); 537 | name = "RxValidator iOS"; 538 | productName = "RxValidator iOS"; 539 | productReference = 9D1550CE2167CE4900C5C889 /* RxValidator.framework */; 540 | productType = "com.apple.product-type.framework"; 541 | }; 542 | 9D1550DA2167CE6C00C5C889 /* RxValidator watchOS */ = { 543 | isa = PBXNativeTarget; 544 | buildConfigurationList = 9D1550E02167CE6C00C5C889 /* Build configuration list for PBXNativeTarget "RxValidator watchOS" */; 545 | buildPhases = ( 546 | 9D1550D62167CE6C00C5C889 /* Headers */, 547 | 9D1550D72167CE6C00C5C889 /* Sources */, 548 | 9D1550D82167CE6C00C5C889 /* Frameworks */, 549 | 9D1550D92167CE6C00C5C889 /* Resources */, 550 | ); 551 | buildRules = ( 552 | ); 553 | dependencies = ( 554 | ); 555 | name = "RxValidator watchOS"; 556 | productName = "RxValidator watchOS"; 557 | productReference = 9D1550DB2167CE6C00C5C889 /* RxValidator.framework */; 558 | productType = "com.apple.product-type.framework"; 559 | }; 560 | 9D1550E72167CE7800C5C889 /* RxValidator tvOS */ = { 561 | isa = PBXNativeTarget; 562 | buildConfigurationList = 9D1550ED2167CE7900C5C889 /* Build configuration list for PBXNativeTarget "RxValidator tvOS" */; 563 | buildPhases = ( 564 | 9D1550E32167CE7800C5C889 /* Headers */, 565 | 9D1550E42167CE7800C5C889 /* Sources */, 566 | 9D1550E52167CE7800C5C889 /* Frameworks */, 567 | 9D1550E62167CE7800C5C889 /* Resources */, 568 | ); 569 | buildRules = ( 570 | ); 571 | dependencies = ( 572 | ); 573 | name = "RxValidator tvOS"; 574 | productName = "RxValidator tvOS"; 575 | productReference = 9D1550E82167CE7800C5C889 /* RxValidator.framework */; 576 | productType = "com.apple.product-type.framework"; 577 | }; 578 | 9D1550F42167CE9100C5C889 /* RxValidator macOS */ = { 579 | isa = PBXNativeTarget; 580 | buildConfigurationList = 9D1550FA2167CE9200C5C889 /* Build configuration list for PBXNativeTarget "RxValidator macOS" */; 581 | buildPhases = ( 582 | 9D1550F02167CE9100C5C889 /* Headers */, 583 | 9D1550F12167CE9100C5C889 /* Sources */, 584 | 9D1550F22167CE9100C5C889 /* Frameworks */, 585 | 9D1550F32167CE9100C5C889 /* Resources */, 586 | ); 587 | buildRules = ( 588 | ); 589 | dependencies = ( 590 | ); 591 | name = "RxValidator macOS"; 592 | productName = "RxValidator macOS"; 593 | productReference = 9D1550F52167CE9100C5C889 /* RxValidator.framework */; 594 | productType = "com.apple.product-type.framework"; 595 | }; 596 | 9D53FCFC2168CFDB00BE3F59 /* RxValidatorTests */ = { 597 | isa = PBXNativeTarget; 598 | buildConfigurationList = 9D53FD072168CFDB00BE3F59 /* Build configuration list for PBXNativeTarget "RxValidatorTests" */; 599 | buildPhases = ( 600 | A784BF38E0366EA493AA7C4A /* [CP] Check Pods Manifest.lock */, 601 | 9D53FCF92168CFDB00BE3F59 /* Sources */, 602 | 9D53FCFA2168CFDB00BE3F59 /* Frameworks */, 603 | 9D53FCFB2168CFDB00BE3F59 /* Resources */, 604 | 0A851D8C037F13B012460B33 /* [CP] Embed Pods Frameworks */, 605 | ); 606 | buildRules = ( 607 | ); 608 | dependencies = ( 609 | 9D53FD042168CFDB00BE3F59 /* PBXTargetDependency */, 610 | 9D53FD3F2168D3F500BE3F59 /* PBXTargetDependency */, 611 | ); 612 | name = RxValidatorTests; 613 | productName = RxValidatorTests; 614 | productReference = 9D53FCFD2168CFDB00BE3F59 /* RxValidatorTests.xctest */; 615 | productType = "com.apple.product-type.bundle.unit-test"; 616 | }; 617 | 9D53FD2B2168D3E500BE3F59 /* RxValidatorTests Host */ = { 618 | isa = PBXNativeTarget; 619 | buildConfigurationList = 9D53FD3B2168D3E700BE3F59 /* Build configuration list for PBXNativeTarget "RxValidatorTests Host" */; 620 | buildPhases = ( 621 | 9D53FD282168D3E500BE3F59 /* Sources */, 622 | 9D53FD292168D3E500BE3F59 /* Frameworks */, 623 | 9D53FD2A2168D3E500BE3F59 /* Resources */, 624 | ); 625 | buildRules = ( 626 | ); 627 | dependencies = ( 628 | ); 629 | name = "RxValidatorTests Host"; 630 | productName = "RxValidatorTests Host"; 631 | productReference = 9D53FD2C2168D3E500BE3F59 /* RxValidatorTests Host.app */; 632 | productType = "com.apple.product-type.application"; 633 | }; 634 | /* End PBXNativeTarget section */ 635 | 636 | /* Begin PBXProject section */ 637 | OBJ_1 /* Project object */ = { 638 | isa = PBXProject; 639 | attributes = { 640 | LastSwiftUpdateCheck = 1000; 641 | LastUpgradeCheck = 9999; 642 | TargetAttributes = { 643 | 9D1550CD2167CE4900C5C889 = { 644 | CreatedOnToolsVersion = 10.0; 645 | ProvisioningStyle = Automatic; 646 | }; 647 | 9D1550DA2167CE6C00C5C889 = { 648 | CreatedOnToolsVersion = 10.0; 649 | ProvisioningStyle = Automatic; 650 | }; 651 | 9D1550E72167CE7800C5C889 = { 652 | CreatedOnToolsVersion = 10.0; 653 | ProvisioningStyle = Automatic; 654 | }; 655 | 9D1550F42167CE9100C5C889 = { 656 | CreatedOnToolsVersion = 10.0; 657 | ProvisioningStyle = Automatic; 658 | }; 659 | 9D53FCFC2168CFDB00BE3F59 = { 660 | CreatedOnToolsVersion = 10.0; 661 | DevelopmentTeam = 4U2J29Y5X8; 662 | ProvisioningStyle = Automatic; 663 | TestTargetID = 9D53FD2B2168D3E500BE3F59; 664 | }; 665 | 9D53FD2B2168D3E500BE3F59 = { 666 | CreatedOnToolsVersion = 10.0; 667 | DevelopmentTeam = 4U2J29Y5X8; 668 | ProvisioningStyle = Automatic; 669 | }; 670 | }; 671 | }; 672 | buildConfigurationList = OBJ_2 /* Build configuration list for PBXProject "RxValidator" */; 673 | compatibilityVersion = "Xcode 3.2"; 674 | developmentRegion = English; 675 | hasScannedForEncodings = 0; 676 | knownRegions = ( 677 | en, 678 | Base, 679 | ); 680 | mainGroup = OBJ_5; 681 | productRefGroup = OBJ_577 /* Products */; 682 | projectDirPath = ""; 683 | projectRoot = ""; 684 | targets = ( 685 | 9D1550CD2167CE4900C5C889 /* RxValidator iOS */, 686 | 9D1550DA2167CE6C00C5C889 /* RxValidator watchOS */, 687 | 9D1550E72167CE7800C5C889 /* RxValidator tvOS */, 688 | 9D1550F42167CE9100C5C889 /* RxValidator macOS */, 689 | 9D53FD2B2168D3E500BE3F59 /* RxValidatorTests Host */, 690 | 9D53FCFC2168CFDB00BE3F59 /* RxValidatorTests */, 691 | ); 692 | }; 693 | /* End PBXProject section */ 694 | 695 | /* Begin PBXResourcesBuildPhase section */ 696 | 9D1550CC2167CE4900C5C889 /* Resources */ = { 697 | isa = PBXResourcesBuildPhase; 698 | buildActionMask = 2147483647; 699 | files = ( 700 | ); 701 | runOnlyForDeploymentPostprocessing = 0; 702 | }; 703 | 9D1550D92167CE6C00C5C889 /* Resources */ = { 704 | isa = PBXResourcesBuildPhase; 705 | buildActionMask = 2147483647; 706 | files = ( 707 | ); 708 | runOnlyForDeploymentPostprocessing = 0; 709 | }; 710 | 9D1550E62167CE7800C5C889 /* Resources */ = { 711 | isa = PBXResourcesBuildPhase; 712 | buildActionMask = 2147483647; 713 | files = ( 714 | ); 715 | runOnlyForDeploymentPostprocessing = 0; 716 | }; 717 | 9D1550F32167CE9100C5C889 /* Resources */ = { 718 | isa = PBXResourcesBuildPhase; 719 | buildActionMask = 2147483647; 720 | files = ( 721 | ); 722 | runOnlyForDeploymentPostprocessing = 0; 723 | }; 724 | 9D53FCFB2168CFDB00BE3F59 /* Resources */ = { 725 | isa = PBXResourcesBuildPhase; 726 | buildActionMask = 2147483647; 727 | files = ( 728 | ); 729 | runOnlyForDeploymentPostprocessing = 0; 730 | }; 731 | 9D53FD2A2168D3E500BE3F59 /* Resources */ = { 732 | isa = PBXResourcesBuildPhase; 733 | buildActionMask = 2147483647; 734 | files = ( 735 | 9D53FD4E2168D42500BE3F59 /* Main.storyboard in Resources */, 736 | 9D53FD4C2168D42500BE3F59 /* Assets.xcassets in Resources */, 737 | 9D53FD4D2168D42500BE3F59 /* LaunchScreen.storyboard in Resources */, 738 | ); 739 | runOnlyForDeploymentPostprocessing = 0; 740 | }; 741 | /* End PBXResourcesBuildPhase section */ 742 | 743 | /* Begin PBXShellScriptBuildPhase section */ 744 | 0A851D8C037F13B012460B33 /* [CP] Embed Pods Frameworks */ = { 745 | isa = PBXShellScriptBuildPhase; 746 | buildActionMask = 2147483647; 747 | files = ( 748 | ); 749 | inputFileListPaths = ( 750 | ); 751 | inputPaths = ( 752 | "${PODS_ROOT}/Target Support Files/Pods-RxValidatorTests/Pods-RxValidatorTests-frameworks.sh", 753 | "${BUILT_PRODUCTS_DIR}/Nimble/Nimble.framework", 754 | "${BUILT_PRODUCTS_DIR}/Quick/Quick.framework", 755 | "${BUILT_PRODUCTS_DIR}/RxCocoa/RxCocoa.framework", 756 | "${BUILT_PRODUCTS_DIR}/RxOptional/RxOptional.framework", 757 | "${BUILT_PRODUCTS_DIR}/RxSwift/RxSwift.framework", 758 | "${BUILT_PRODUCTS_DIR}/SwiftDate/SwiftDate.framework", 759 | ); 760 | name = "[CP] Embed Pods Frameworks"; 761 | outputFileListPaths = ( 762 | ); 763 | outputPaths = ( 764 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Nimble.framework", 765 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Quick.framework", 766 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxCocoa.framework", 767 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxOptional.framework", 768 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxSwift.framework", 769 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftDate.framework", 770 | ); 771 | runOnlyForDeploymentPostprocessing = 0; 772 | shellPath = /bin/sh; 773 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RxValidatorTests/Pods-RxValidatorTests-frameworks.sh\"\n"; 774 | showEnvVarsInLog = 0; 775 | }; 776 | A784BF38E0366EA493AA7C4A /* [CP] Check Pods Manifest.lock */ = { 777 | isa = PBXShellScriptBuildPhase; 778 | buildActionMask = 2147483647; 779 | files = ( 780 | ); 781 | inputFileListPaths = ( 782 | ); 783 | inputPaths = ( 784 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 785 | "${PODS_ROOT}/Manifest.lock", 786 | ); 787 | name = "[CP] Check Pods Manifest.lock"; 788 | outputFileListPaths = ( 789 | ); 790 | outputPaths = ( 791 | "$(DERIVED_FILE_DIR)/Pods-RxValidatorTests-checkManifestLockResult.txt", 792 | ); 793 | runOnlyForDeploymentPostprocessing = 0; 794 | shellPath = /bin/sh; 795 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 796 | showEnvVarsInLog = 0; 797 | }; 798 | /* End PBXShellScriptBuildPhase section */ 799 | 800 | /* Begin PBXSourcesBuildPhase section */ 801 | 9D1550CA2167CE4900C5C889 /* Sources */ = { 802 | isa = PBXSourcesBuildPhase; 803 | buildActionMask = 2147483647; 804 | files = ( 805 | 9D53FCB72168C5FE00BE3F59 /* DateValidator.swift in Sources */, 806 | 9D53FCD72168CF4100BE3F59 /* NumberShouldGreaterThan.swift in Sources */, 807 | 9D53FC562167E1EE00BE3F59 /* Validate.swift in Sources */, 808 | 9D53FCD22168CDEB00BE3F59 /* NumberShouldLessThan.swift in Sources */, 809 | 9D53FCC32168C8A300BE3F59 /* DateShouldBeCloseDates.swift in Sources */, 810 | 9D53FC572167E1EE00BE3F59 /* DateValidationTarget.swift in Sources */, 811 | 9D53FCCD2168CBD400BE3F59 /* NumberShouldEqualTo.swift in Sources */, 812 | 9D53FC582167E1EE00BE3F59 /* NumberValidationTarget.swift in Sources */, 813 | 9D53FCBF2168C7EC00BE3F59 /* DateShouldAfterThen.swift in Sources */, 814 | 9D53FC592167E1EE00BE3F59 /* StringValidationTarget.swift in Sources */, 815 | 9D53FC5A2167E1EE00BE3F59 /* Observable+Date+Extension.swift in Sources */, 816 | 9D53FCB92168C64E00BE3F59 /* DateShouldEqualTo.swift in Sources */, 817 | 9D53FC5B2167E1EE00BE3F59 /* Observable+Number+Extension.swift in Sources */, 818 | 9D53FCC52168C9F200BE3F59 /* StringIsNotUnderflowThen.swift in Sources */, 819 | 9D53FCC72168CA7B00BE3F59 /* StringShouldEqualTo.swift in Sources */, 820 | 9D53FCBB2168C71C00BE3F59 /* DateShouldBeforeThen.swift in Sources */, 821 | 9D53FC5C2167E1EE00BE3F59 /* Observable+String+Extension.swift in Sources */, 822 | 9D53FC5E2167E1EE00BE3F59 /* StringValidator.swift in Sources */, 823 | 9D53FC5F2167E1EE00BE3F59 /* ValidationTarget.swift in Sources */, 824 | 9D53FCBD2168C79600BE3F59 /* DateShouldBeforeOrSameThen.swift in Sources */, 825 | 9D53FC602167E1EE00BE3F59 /* RxValidatorResult.swift in Sources */, 826 | 9D53FCC92168CB9000BE3F59 /* NumberValidator.swift in Sources */, 827 | 9D53FD572168E24400BE3F59 /* StringIsAlwaysPass.swift in Sources */, 828 | 9D53FC622167E1EE00BE3F59 /* IntShouldBeEven.swift in Sources */, 829 | 9D53FC642167E1EE00BE3F59 /* StringIsNotOverflowThen.swift in Sources */, 830 | 9D53FCC12168C84A00BE3F59 /* DateShouldAfterOrSameThen.swift in Sources */, 831 | 9D53FC652167E1EE00BE3F59 /* StringShouldBeMatch.swift in Sources */, 832 | 9D53FC662167E1EE00BE3F59 /* StringShouldNotBeEmpty.swift in Sources */, 833 | ); 834 | runOnlyForDeploymentPostprocessing = 0; 835 | }; 836 | 9D1550D72167CE6C00C5C889 /* Sources */ = { 837 | isa = PBXSourcesBuildPhase; 838 | buildActionMask = 2147483647; 839 | files = ( 840 | 9D53FCDB2168CF6A00BE3F59 /* NumberValidator.swift in Sources */, 841 | 9D53FCDC2168CF6A00BE3F59 /* DateValidator.swift in Sources */, 842 | 9D53FCDD2168CF6A00BE3F59 /* DateShouldEqualTo.swift in Sources */, 843 | 9D53FCDE2168CF6A00BE3F59 /* DateShouldBeforeThen.swift in Sources */, 844 | 9D53FCDF2168CF6A00BE3F59 /* DateShouldBeforeOrSameThen.swift in Sources */, 845 | 9D53FCE02168CF6A00BE3F59 /* DateShouldAfterThen.swift in Sources */, 846 | 9D53FCE12168CF6A00BE3F59 /* DateShouldAfterOrSameThen.swift in Sources */, 847 | 9D53FCE22168CF6A00BE3F59 /* DateShouldBeCloseDates.swift in Sources */, 848 | 9D53FCE32168CF6A00BE3F59 /* StringIsNotUnderflowThen.swift in Sources */, 849 | 9D53FCE42168CF6A00BE3F59 /* StringShouldEqualTo.swift in Sources */, 850 | 9D53FC672167E1F900BE3F59 /* Validate.swift in Sources */, 851 | 9D53FC682167E1F900BE3F59 /* DateValidationTarget.swift in Sources */, 852 | 9D53FCD32168CDEB00BE3F59 /* NumberShouldLessThan.swift in Sources */, 853 | 9D53FC692167E1F900BE3F59 /* NumberValidationTarget.swift in Sources */, 854 | 9D53FC6A2167E1F900BE3F59 /* StringValidationTarget.swift in Sources */, 855 | 9D53FC6B2167E1F900BE3F59 /* Observable+Date+Extension.swift in Sources */, 856 | 9D53FC6C2167E1F900BE3F59 /* Observable+Number+Extension.swift in Sources */, 857 | 9D53FC6D2167E1F900BE3F59 /* Observable+String+Extension.swift in Sources */, 858 | 9D53FC6F2167E1F900BE3F59 /* StringValidator.swift in Sources */, 859 | 9D53FC702167E1F900BE3F59 /* ValidationTarget.swift in Sources */, 860 | 9D53FCCE2168CBD400BE3F59 /* NumberShouldEqualTo.swift in Sources */, 861 | 9D53FC712167E1F900BE3F59 /* RxValidatorResult.swift in Sources */, 862 | 9D53FD582168E24400BE3F59 /* StringIsAlwaysPass.swift in Sources */, 863 | 9D53FC732167E1F900BE3F59 /* IntShouldBeEven.swift in Sources */, 864 | 9D53FC752167E1F900BE3F59 /* StringIsNotOverflowThen.swift in Sources */, 865 | 9D53FC762167E1F900BE3F59 /* StringShouldBeMatch.swift in Sources */, 866 | 9D53FC772167E1F900BE3F59 /* StringShouldNotBeEmpty.swift in Sources */, 867 | 9D53FCD82168CF4100BE3F59 /* NumberShouldGreaterThan.swift in Sources */, 868 | ); 869 | runOnlyForDeploymentPostprocessing = 0; 870 | }; 871 | 9D1550E42167CE7800C5C889 /* Sources */ = { 872 | isa = PBXSourcesBuildPhase; 873 | buildActionMask = 2147483647; 874 | files = ( 875 | 9D53FCE52168CF7300BE3F59 /* NumberValidator.swift in Sources */, 876 | 9D53FCE62168CF7300BE3F59 /* DateValidator.swift in Sources */, 877 | 9D53FCE72168CF7300BE3F59 /* DateShouldEqualTo.swift in Sources */, 878 | 9D53FCE82168CF7300BE3F59 /* DateShouldBeforeThen.swift in Sources */, 879 | 9D53FCE92168CF7300BE3F59 /* DateShouldBeforeOrSameThen.swift in Sources */, 880 | 9D53FCEA2168CF7300BE3F59 /* DateShouldAfterThen.swift in Sources */, 881 | 9D53FCEB2168CF7300BE3F59 /* DateShouldAfterOrSameThen.swift in Sources */, 882 | 9D53FCEC2168CF7300BE3F59 /* DateShouldBeCloseDates.swift in Sources */, 883 | 9D53FCED2168CF7300BE3F59 /* StringIsNotUnderflowThen.swift in Sources */, 884 | 9D53FCEE2168CF7300BE3F59 /* StringShouldEqualTo.swift in Sources */, 885 | 9D53FC782167E1FF00BE3F59 /* Validate.swift in Sources */, 886 | 9D53FC792167E1FF00BE3F59 /* DateValidationTarget.swift in Sources */, 887 | 9D53FCD42168CDEB00BE3F59 /* NumberShouldLessThan.swift in Sources */, 888 | 9D53FC7A2167E1FF00BE3F59 /* NumberValidationTarget.swift in Sources */, 889 | 9D53FC7B2167E1FF00BE3F59 /* StringValidationTarget.swift in Sources */, 890 | 9D53FC7C2167E1FF00BE3F59 /* Observable+Date+Extension.swift in Sources */, 891 | 9D53FC7D2167E1FF00BE3F59 /* Observable+Number+Extension.swift in Sources */, 892 | 9D53FC7E2167E1FF00BE3F59 /* Observable+String+Extension.swift in Sources */, 893 | 9D53FC802167E1FF00BE3F59 /* StringValidator.swift in Sources */, 894 | 9D53FC812167E1FF00BE3F59 /* ValidationTarget.swift in Sources */, 895 | 9D53FCCF2168CBD400BE3F59 /* NumberShouldEqualTo.swift in Sources */, 896 | 9D53FC822167E1FF00BE3F59 /* RxValidatorResult.swift in Sources */, 897 | 9D53FD592168E24400BE3F59 /* StringIsAlwaysPass.swift in Sources */, 898 | 9D53FC842167E1FF00BE3F59 /* IntShouldBeEven.swift in Sources */, 899 | 9D53FC862167E1FF00BE3F59 /* StringIsNotOverflowThen.swift in Sources */, 900 | 9D53FC872167E1FF00BE3F59 /* StringShouldBeMatch.swift in Sources */, 901 | 9D53FC882167E1FF00BE3F59 /* StringShouldNotBeEmpty.swift in Sources */, 902 | 9D53FCD92168CF4100BE3F59 /* NumberShouldGreaterThan.swift in Sources */, 903 | ); 904 | runOnlyForDeploymentPostprocessing = 0; 905 | }; 906 | 9D1550F12167CE9100C5C889 /* Sources */ = { 907 | isa = PBXSourcesBuildPhase; 908 | buildActionMask = 2147483647; 909 | files = ( 910 | 9D53FCEF2168CF7A00BE3F59 /* NumberValidator.swift in Sources */, 911 | 9D53FCF02168CF7A00BE3F59 /* DateValidator.swift in Sources */, 912 | 9D53FCF12168CF7A00BE3F59 /* DateShouldEqualTo.swift in Sources */, 913 | 9D53FCF22168CF7A00BE3F59 /* DateShouldBeforeThen.swift in Sources */, 914 | 9D53FCF32168CF7A00BE3F59 /* DateShouldBeforeOrSameThen.swift in Sources */, 915 | 9D53FCF42168CF7A00BE3F59 /* DateShouldAfterThen.swift in Sources */, 916 | 9D53FCF52168CF7A00BE3F59 /* DateShouldAfterOrSameThen.swift in Sources */, 917 | 9D53FCF62168CF7A00BE3F59 /* DateShouldBeCloseDates.swift in Sources */, 918 | 9D53FCF72168CF7A00BE3F59 /* StringIsNotUnderflowThen.swift in Sources */, 919 | 9D53FCF82168CF7A00BE3F59 /* StringShouldEqualTo.swift in Sources */, 920 | 9D53FC892167E20400BE3F59 /* Validate.swift in Sources */, 921 | 9D53FC8A2167E20400BE3F59 /* DateValidationTarget.swift in Sources */, 922 | 9D53FCD52168CDEB00BE3F59 /* NumberShouldLessThan.swift in Sources */, 923 | 9D53FC8B2167E20400BE3F59 /* NumberValidationTarget.swift in Sources */, 924 | 9D53FC8C2167E20400BE3F59 /* StringValidationTarget.swift in Sources */, 925 | 9D53FC8D2167E20400BE3F59 /* Observable+Date+Extension.swift in Sources */, 926 | 9D53FC8E2167E20400BE3F59 /* Observable+Number+Extension.swift in Sources */, 927 | 9D53FC8F2167E20400BE3F59 /* Observable+String+Extension.swift in Sources */, 928 | 9D53FC912167E20400BE3F59 /* StringValidator.swift in Sources */, 929 | 9D53FC922167E20400BE3F59 /* ValidationTarget.swift in Sources */, 930 | 9D53FCD02168CBD400BE3F59 /* NumberShouldEqualTo.swift in Sources */, 931 | 9D53FC932167E20400BE3F59 /* RxValidatorResult.swift in Sources */, 932 | 9D53FD5A2168E24400BE3F59 /* StringIsAlwaysPass.swift in Sources */, 933 | 9D53FC952167E20400BE3F59 /* IntShouldBeEven.swift in Sources */, 934 | 9D53FC972167E20400BE3F59 /* StringIsNotOverflowThen.swift in Sources */, 935 | 9D53FC982167E20400BE3F59 /* StringShouldBeMatch.swift in Sources */, 936 | 9D53FC992167E20400BE3F59 /* StringShouldNotBeEmpty.swift in Sources */, 937 | 9D53FCDA2168CF4100BE3F59 /* NumberShouldGreaterThan.swift in Sources */, 938 | ); 939 | runOnlyForDeploymentPostprocessing = 0; 940 | }; 941 | 9D53FCF92168CFDB00BE3F59 /* Sources */ = { 942 | isa = PBXSourcesBuildPhase; 943 | buildActionMask = 2147483647; 944 | files = ( 945 | 9D53FD552168D68700BE3F59 /* ValidationWithRxSwiftTests.swift in Sources */, 946 | 9D53FD182168D03200BE3F59 /* StringValidateRegexTests.swift in Sources */, 947 | 9D53FD152168D03200BE3F59 /* StringValidateTests.swift in Sources */, 948 | 9D53FD112168D03200BE3F59 /* AlwaysFailingTests.swift in Sources */, 949 | 9D53FD172168D03200BE3F59 /* NumberValidateTests.swift in Sources */, 950 | 9D53FD162168D03200BE3F59 /* ObservableExtensionTests.swift in Sources */, 951 | 9D53FD142168D03200BE3F59 /* RxValidatorResultTests.swift in Sources */, 952 | 9D53FD132168D03200BE3F59 /* DateValidateTests.swift in Sources */, 953 | 9D53FD122168D03200BE3F59 /* InstantValidateTests.swift in Sources */, 954 | ); 955 | runOnlyForDeploymentPostprocessing = 0; 956 | }; 957 | 9D53FD282168D3E500BE3F59 /* Sources */ = { 958 | isa = PBXSourcesBuildPhase; 959 | buildActionMask = 2147483647; 960 | files = ( 961 | 9D53FD512168D42500BE3F59 /* AppDelegate.swift in Sources */, 962 | 9D53FD502168D42500BE3F59 /* ViewController.swift in Sources */, 963 | ); 964 | runOnlyForDeploymentPostprocessing = 0; 965 | }; 966 | /* End PBXSourcesBuildPhase section */ 967 | 968 | /* Begin PBXTargetDependency section */ 969 | 9D53FD042168CFDB00BE3F59 /* PBXTargetDependency */ = { 970 | isa = PBXTargetDependency; 971 | target = 9D1550CD2167CE4900C5C889 /* RxValidator iOS */; 972 | targetProxy = 9D53FD032168CFDB00BE3F59 /* PBXContainerItemProxy */; 973 | }; 974 | 9D53FD3F2168D3F500BE3F59 /* PBXTargetDependency */ = { 975 | isa = PBXTargetDependency; 976 | target = 9D53FD2B2168D3E500BE3F59 /* RxValidatorTests Host */; 977 | targetProxy = 9D53FD3E2168D3F500BE3F59 /* PBXContainerItemProxy */; 978 | }; 979 | /* End PBXTargetDependency section */ 980 | 981 | /* Begin PBXVariantGroup section */ 982 | 9D53FD432168D42500BE3F59 /* LaunchScreen.storyboard */ = { 983 | isa = PBXVariantGroup; 984 | children = ( 985 | 9D53FD442168D42500BE3F59 /* Base */, 986 | ); 987 | name = LaunchScreen.storyboard; 988 | sourceTree = ""; 989 | }; 990 | 9D53FD452168D42500BE3F59 /* Main.storyboard */ = { 991 | isa = PBXVariantGroup; 992 | children = ( 993 | 9D53FD462168D42500BE3F59 /* Base */, 994 | ); 995 | name = Main.storyboard; 996 | sourceTree = ""; 997 | }; 998 | /* End PBXVariantGroup section */ 999 | 1000 | /* Begin XCBuildConfiguration section */ 1001 | 9D1550D42167CE4900C5C889 /* Debug */ = { 1002 | isa = XCBuildConfiguration; 1003 | buildSettings = { 1004 | ALWAYS_SEARCH_USER_PATHS = NO; 1005 | CLANG_ANALYZER_NONNULL = YES; 1006 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 1007 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 1008 | CLANG_CXX_LIBRARY = "libc++"; 1009 | CLANG_ENABLE_MODULES = YES; 1010 | CLANG_ENABLE_OBJC_WEAK = YES; 1011 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 1012 | CLANG_WARN_BOOL_CONVERSION = YES; 1013 | CLANG_WARN_COMMA = YES; 1014 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1015 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 1016 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1017 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1018 | CLANG_WARN_EMPTY_BODY = YES; 1019 | CLANG_WARN_ENUM_CONVERSION = YES; 1020 | CLANG_WARN_INFINITE_RECURSION = YES; 1021 | CLANG_WARN_INT_CONVERSION = YES; 1022 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 1023 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 1024 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 1025 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1026 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 1027 | CLANG_WARN_STRICT_PROTOTYPES = YES; 1028 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1029 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 1030 | CLANG_WARN_UNREACHABLE_CODE = YES; 1031 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1032 | CODE_SIGN_IDENTITY = "iPhone Developer"; 1033 | CODE_SIGN_STYLE = Automatic; 1034 | CURRENT_PROJECT_VERSION = 1; 1035 | DEFINES_MODULE = YES; 1036 | DYLIB_COMPATIBILITY_VERSION = 1; 1037 | DYLIB_CURRENT_VERSION = 1; 1038 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1039 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1040 | ENABLE_TESTABILITY = YES; 1041 | FRAMEWORK_SEARCH_PATHS = ( 1042 | "$(inherited)", 1043 | "$(PROJECT_DIR)/Carthage/Build/iOS", 1044 | ); 1045 | GCC_C_LANGUAGE_STANDARD = gnu11; 1046 | GCC_DYNAMIC_NO_PIC = NO; 1047 | GCC_NO_COMMON_BLOCKS = YES; 1048 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1049 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1050 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1051 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1052 | GCC_WARN_UNUSED_FUNCTION = YES; 1053 | GCC_WARN_UNUSED_VARIABLE = YES; 1054 | INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Info.plist"; 1055 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1056 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1057 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1058 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 1059 | MTL_FAST_MATH = YES; 1060 | PRODUCT_BUNDLE_IDENTIFIER = io.github.vbmania.RxValidator; 1061 | PRODUCT_NAME = RxValidator; 1062 | SDKROOT = iphoneos; 1063 | SKIP_INSTALL = YES; 1064 | SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; 1065 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 1066 | SWIFT_VERSION = 4.2; 1067 | TARGETED_DEVICE_FAMILY = "1,2"; 1068 | VERSIONING_SYSTEM = "apple-generic"; 1069 | VERSION_INFO_PREFIX = ""; 1070 | }; 1071 | name = Debug; 1072 | }; 1073 | 9D1550D52167CE4900C5C889 /* Release */ = { 1074 | isa = XCBuildConfiguration; 1075 | buildSettings = { 1076 | ALWAYS_SEARCH_USER_PATHS = NO; 1077 | CLANG_ANALYZER_NONNULL = YES; 1078 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 1079 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 1080 | CLANG_CXX_LIBRARY = "libc++"; 1081 | CLANG_ENABLE_MODULES = YES; 1082 | CLANG_ENABLE_OBJC_WEAK = YES; 1083 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 1084 | CLANG_WARN_BOOL_CONVERSION = YES; 1085 | CLANG_WARN_COMMA = YES; 1086 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1087 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 1088 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1089 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1090 | CLANG_WARN_EMPTY_BODY = YES; 1091 | CLANG_WARN_ENUM_CONVERSION = YES; 1092 | CLANG_WARN_INFINITE_RECURSION = YES; 1093 | CLANG_WARN_INT_CONVERSION = YES; 1094 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 1095 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 1096 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 1097 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1098 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 1099 | CLANG_WARN_STRICT_PROTOTYPES = YES; 1100 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1101 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 1102 | CLANG_WARN_UNREACHABLE_CODE = YES; 1103 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1104 | CODE_SIGN_IDENTITY = "iPhone Developer"; 1105 | CODE_SIGN_STYLE = Automatic; 1106 | COPY_PHASE_STRIP = NO; 1107 | CURRENT_PROJECT_VERSION = 1; 1108 | DEFINES_MODULE = YES; 1109 | DYLIB_COMPATIBILITY_VERSION = 1; 1110 | DYLIB_CURRENT_VERSION = 1; 1111 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1112 | ENABLE_NS_ASSERTIONS = NO; 1113 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1114 | FRAMEWORK_SEARCH_PATHS = ( 1115 | "$(inherited)", 1116 | "$(PROJECT_DIR)/Carthage/Build/iOS", 1117 | ); 1118 | GCC_C_LANGUAGE_STANDARD = gnu11; 1119 | GCC_NO_COMMON_BLOCKS = YES; 1120 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1121 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1122 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1123 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1124 | GCC_WARN_UNUSED_FUNCTION = YES; 1125 | GCC_WARN_UNUSED_VARIABLE = YES; 1126 | INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Info.plist"; 1127 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1128 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 1129 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1130 | MTL_ENABLE_DEBUG_INFO = NO; 1131 | MTL_FAST_MATH = YES; 1132 | PRODUCT_BUNDLE_IDENTIFIER = io.github.vbmania.RxValidator; 1133 | PRODUCT_NAME = RxValidator; 1134 | SDKROOT = iphoneos; 1135 | SKIP_INSTALL = YES; 1136 | SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; 1137 | SWIFT_VERSION = 4.2; 1138 | TARGETED_DEVICE_FAMILY = "1,2"; 1139 | VALIDATE_PRODUCT = YES; 1140 | VERSIONING_SYSTEM = "apple-generic"; 1141 | VERSION_INFO_PREFIX = ""; 1142 | }; 1143 | name = Release; 1144 | }; 1145 | 9D1550E12167CE6C00C5C889 /* Debug */ = { 1146 | isa = XCBuildConfiguration; 1147 | buildSettings = { 1148 | ALWAYS_SEARCH_USER_PATHS = NO; 1149 | APPLICATION_EXTENSION_API_ONLY = YES; 1150 | CLANG_ANALYZER_NONNULL = YES; 1151 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 1152 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 1153 | CLANG_CXX_LIBRARY = "libc++"; 1154 | CLANG_ENABLE_MODULES = YES; 1155 | CLANG_ENABLE_OBJC_WEAK = YES; 1156 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 1157 | CLANG_WARN_BOOL_CONVERSION = YES; 1158 | CLANG_WARN_COMMA = YES; 1159 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1160 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 1161 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1162 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1163 | CLANG_WARN_EMPTY_BODY = YES; 1164 | CLANG_WARN_ENUM_CONVERSION = YES; 1165 | CLANG_WARN_INFINITE_RECURSION = YES; 1166 | CLANG_WARN_INT_CONVERSION = YES; 1167 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 1168 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 1169 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 1170 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1171 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 1172 | CLANG_WARN_STRICT_PROTOTYPES = YES; 1173 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1174 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 1175 | CLANG_WARN_UNREACHABLE_CODE = YES; 1176 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1177 | CODE_SIGN_IDENTITY = ""; 1178 | CODE_SIGN_STYLE = Automatic; 1179 | CURRENT_PROJECT_VERSION = 1; 1180 | DEFINES_MODULE = YES; 1181 | DYLIB_COMPATIBILITY_VERSION = 1; 1182 | DYLIB_CURRENT_VERSION = 1; 1183 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1184 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1185 | ENABLE_TESTABILITY = YES; 1186 | FRAMEWORK_SEARCH_PATHS = ( 1187 | "$(inherited)", 1188 | "$(PROJECT_DIR)/Carthage/Build/watchOS", 1189 | ); 1190 | GCC_C_LANGUAGE_STANDARD = gnu11; 1191 | GCC_DYNAMIC_NO_PIC = NO; 1192 | GCC_NO_COMMON_BLOCKS = YES; 1193 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1194 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1195 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1196 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1197 | GCC_WARN_UNUSED_FUNCTION = YES; 1198 | GCC_WARN_UNUSED_VARIABLE = YES; 1199 | INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Info.plist"; 1200 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1201 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1202 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 1203 | MTL_FAST_MATH = YES; 1204 | PRODUCT_BUNDLE_IDENTIFIER = io.github.vbmania.RxValidator; 1205 | PRODUCT_NAME = RxValidator; 1206 | SDKROOT = watchos; 1207 | SKIP_INSTALL = YES; 1208 | SUPPORTED_PLATFORMS = "watchsimulator watchos"; 1209 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 1210 | SWIFT_VERSION = 4.2; 1211 | TARGETED_DEVICE_FAMILY = 4; 1212 | VERSIONING_SYSTEM = "apple-generic"; 1213 | VERSION_INFO_PREFIX = ""; 1214 | WATCHOS_DEPLOYMENT_TARGET = 2.0; 1215 | }; 1216 | name = Debug; 1217 | }; 1218 | 9D1550E22167CE6C00C5C889 /* Release */ = { 1219 | isa = XCBuildConfiguration; 1220 | buildSettings = { 1221 | ALWAYS_SEARCH_USER_PATHS = NO; 1222 | APPLICATION_EXTENSION_API_ONLY = YES; 1223 | CLANG_ANALYZER_NONNULL = YES; 1224 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 1225 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 1226 | CLANG_CXX_LIBRARY = "libc++"; 1227 | CLANG_ENABLE_MODULES = YES; 1228 | CLANG_ENABLE_OBJC_WEAK = YES; 1229 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 1230 | CLANG_WARN_BOOL_CONVERSION = YES; 1231 | CLANG_WARN_COMMA = YES; 1232 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1233 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 1234 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1235 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1236 | CLANG_WARN_EMPTY_BODY = YES; 1237 | CLANG_WARN_ENUM_CONVERSION = YES; 1238 | CLANG_WARN_INFINITE_RECURSION = YES; 1239 | CLANG_WARN_INT_CONVERSION = YES; 1240 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 1241 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 1242 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 1243 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1244 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 1245 | CLANG_WARN_STRICT_PROTOTYPES = YES; 1246 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1247 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 1248 | CLANG_WARN_UNREACHABLE_CODE = YES; 1249 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1250 | CODE_SIGN_IDENTITY = ""; 1251 | CODE_SIGN_STYLE = Automatic; 1252 | COPY_PHASE_STRIP = NO; 1253 | CURRENT_PROJECT_VERSION = 1; 1254 | DEFINES_MODULE = YES; 1255 | DYLIB_COMPATIBILITY_VERSION = 1; 1256 | DYLIB_CURRENT_VERSION = 1; 1257 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1258 | ENABLE_NS_ASSERTIONS = NO; 1259 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1260 | FRAMEWORK_SEARCH_PATHS = ( 1261 | "$(inherited)", 1262 | "$(PROJECT_DIR)/Carthage/Build/watchOS", 1263 | ); 1264 | GCC_C_LANGUAGE_STANDARD = gnu11; 1265 | GCC_NO_COMMON_BLOCKS = YES; 1266 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1267 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1268 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1269 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1270 | GCC_WARN_UNUSED_FUNCTION = YES; 1271 | GCC_WARN_UNUSED_VARIABLE = YES; 1272 | INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Info.plist"; 1273 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1274 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1275 | MTL_ENABLE_DEBUG_INFO = NO; 1276 | MTL_FAST_MATH = YES; 1277 | PRODUCT_BUNDLE_IDENTIFIER = io.github.vbmania.RxValidator; 1278 | PRODUCT_NAME = RxValidator; 1279 | SDKROOT = watchos; 1280 | SKIP_INSTALL = YES; 1281 | SUPPORTED_PLATFORMS = "watchsimulator watchos"; 1282 | SWIFT_VERSION = 4.2; 1283 | TARGETED_DEVICE_FAMILY = 4; 1284 | VALIDATE_PRODUCT = YES; 1285 | VERSIONING_SYSTEM = "apple-generic"; 1286 | VERSION_INFO_PREFIX = ""; 1287 | WATCHOS_DEPLOYMENT_TARGET = 2.0; 1288 | }; 1289 | name = Release; 1290 | }; 1291 | 9D1550EE2167CE7900C5C889 /* Debug */ = { 1292 | isa = XCBuildConfiguration; 1293 | buildSettings = { 1294 | ALWAYS_SEARCH_USER_PATHS = NO; 1295 | CLANG_ANALYZER_NONNULL = YES; 1296 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 1297 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 1298 | CLANG_CXX_LIBRARY = "libc++"; 1299 | CLANG_ENABLE_MODULES = YES; 1300 | CLANG_ENABLE_OBJC_WEAK = YES; 1301 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 1302 | CLANG_WARN_BOOL_CONVERSION = YES; 1303 | CLANG_WARN_COMMA = YES; 1304 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1305 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 1306 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1307 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1308 | CLANG_WARN_EMPTY_BODY = YES; 1309 | CLANG_WARN_ENUM_CONVERSION = YES; 1310 | CLANG_WARN_INFINITE_RECURSION = YES; 1311 | CLANG_WARN_INT_CONVERSION = YES; 1312 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 1313 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 1314 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 1315 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1316 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 1317 | CLANG_WARN_STRICT_PROTOTYPES = YES; 1318 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1319 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 1320 | CLANG_WARN_UNREACHABLE_CODE = YES; 1321 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1322 | CODE_SIGN_IDENTITY = ""; 1323 | CODE_SIGN_STYLE = Automatic; 1324 | CURRENT_PROJECT_VERSION = 1; 1325 | DEFINES_MODULE = YES; 1326 | DYLIB_COMPATIBILITY_VERSION = 1; 1327 | DYLIB_CURRENT_VERSION = 1; 1328 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1329 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1330 | ENABLE_TESTABILITY = YES; 1331 | FRAMEWORK_SEARCH_PATHS = ( 1332 | "$(inherited)", 1333 | "$(PROJECT_DIR)/Carthage/Build/tvOS", 1334 | ); 1335 | GCC_C_LANGUAGE_STANDARD = gnu11; 1336 | GCC_DYNAMIC_NO_PIC = NO; 1337 | GCC_NO_COMMON_BLOCKS = YES; 1338 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1339 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1340 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1341 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1342 | GCC_WARN_UNUSED_FUNCTION = YES; 1343 | GCC_WARN_UNUSED_VARIABLE = YES; 1344 | INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Info.plist"; 1345 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1346 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1347 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 1348 | MTL_FAST_MATH = YES; 1349 | PRODUCT_BUNDLE_IDENTIFIER = io.github.vbmania.RxValidator; 1350 | PRODUCT_NAME = RxValidator; 1351 | SDKROOT = appletvos; 1352 | SKIP_INSTALL = YES; 1353 | SUPPORTED_PLATFORMS = "appletvsimulator appletvos"; 1354 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 1355 | SWIFT_VERSION = 4.2; 1356 | TARGETED_DEVICE_FAMILY = 3; 1357 | TVOS_DEPLOYMENT_TARGET = 9.0; 1358 | VERSIONING_SYSTEM = "apple-generic"; 1359 | VERSION_INFO_PREFIX = ""; 1360 | }; 1361 | name = Debug; 1362 | }; 1363 | 9D1550EF2167CE7900C5C889 /* Release */ = { 1364 | isa = XCBuildConfiguration; 1365 | buildSettings = { 1366 | ALWAYS_SEARCH_USER_PATHS = NO; 1367 | CLANG_ANALYZER_NONNULL = YES; 1368 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 1369 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 1370 | CLANG_CXX_LIBRARY = "libc++"; 1371 | CLANG_ENABLE_MODULES = YES; 1372 | CLANG_ENABLE_OBJC_WEAK = YES; 1373 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 1374 | CLANG_WARN_BOOL_CONVERSION = YES; 1375 | CLANG_WARN_COMMA = YES; 1376 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1377 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 1378 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1379 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1380 | CLANG_WARN_EMPTY_BODY = YES; 1381 | CLANG_WARN_ENUM_CONVERSION = YES; 1382 | CLANG_WARN_INFINITE_RECURSION = YES; 1383 | CLANG_WARN_INT_CONVERSION = YES; 1384 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 1385 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 1386 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 1387 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1388 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 1389 | CLANG_WARN_STRICT_PROTOTYPES = YES; 1390 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1391 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 1392 | CLANG_WARN_UNREACHABLE_CODE = YES; 1393 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1394 | CODE_SIGN_IDENTITY = ""; 1395 | CODE_SIGN_STYLE = Automatic; 1396 | COPY_PHASE_STRIP = NO; 1397 | CURRENT_PROJECT_VERSION = 1; 1398 | DEFINES_MODULE = YES; 1399 | DYLIB_COMPATIBILITY_VERSION = 1; 1400 | DYLIB_CURRENT_VERSION = 1; 1401 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1402 | ENABLE_NS_ASSERTIONS = NO; 1403 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1404 | FRAMEWORK_SEARCH_PATHS = ( 1405 | "$(inherited)", 1406 | "$(PROJECT_DIR)/Carthage/Build/tvOS", 1407 | ); 1408 | GCC_C_LANGUAGE_STANDARD = gnu11; 1409 | GCC_NO_COMMON_BLOCKS = YES; 1410 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1411 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1412 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1413 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1414 | GCC_WARN_UNUSED_FUNCTION = YES; 1415 | GCC_WARN_UNUSED_VARIABLE = YES; 1416 | INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Info.plist"; 1417 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1418 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1419 | MTL_ENABLE_DEBUG_INFO = NO; 1420 | MTL_FAST_MATH = YES; 1421 | PRODUCT_BUNDLE_IDENTIFIER = io.github.vbmania.RxValidator; 1422 | PRODUCT_NAME = RxValidator; 1423 | SDKROOT = appletvos; 1424 | SKIP_INSTALL = YES; 1425 | SUPPORTED_PLATFORMS = "appletvsimulator appletvos"; 1426 | SWIFT_VERSION = 4.2; 1427 | TARGETED_DEVICE_FAMILY = 3; 1428 | TVOS_DEPLOYMENT_TARGET = 9.0; 1429 | VALIDATE_PRODUCT = YES; 1430 | VERSIONING_SYSTEM = "apple-generic"; 1431 | VERSION_INFO_PREFIX = ""; 1432 | }; 1433 | name = Release; 1434 | }; 1435 | 9D1550FB2167CE9200C5C889 /* Debug */ = { 1436 | isa = XCBuildConfiguration; 1437 | buildSettings = { 1438 | ALWAYS_SEARCH_USER_PATHS = NO; 1439 | CLANG_ANALYZER_NONNULL = YES; 1440 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 1441 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 1442 | CLANG_CXX_LIBRARY = "libc++"; 1443 | CLANG_ENABLE_MODULES = YES; 1444 | CLANG_ENABLE_OBJC_WEAK = YES; 1445 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 1446 | CLANG_WARN_BOOL_CONVERSION = YES; 1447 | CLANG_WARN_COMMA = YES; 1448 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1449 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 1450 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1451 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1452 | CLANG_WARN_EMPTY_BODY = YES; 1453 | CLANG_WARN_ENUM_CONVERSION = YES; 1454 | CLANG_WARN_INFINITE_RECURSION = YES; 1455 | CLANG_WARN_INT_CONVERSION = YES; 1456 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 1457 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 1458 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 1459 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1460 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 1461 | CLANG_WARN_STRICT_PROTOTYPES = YES; 1462 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1463 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 1464 | CLANG_WARN_UNREACHABLE_CODE = YES; 1465 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1466 | CODE_SIGN_IDENTITY = "-"; 1467 | CODE_SIGN_STYLE = Automatic; 1468 | COMBINE_HIDPI_IMAGES = YES; 1469 | CURRENT_PROJECT_VERSION = 1; 1470 | DEFINES_MODULE = YES; 1471 | DYLIB_COMPATIBILITY_VERSION = 1; 1472 | DYLIB_CURRENT_VERSION = 1; 1473 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1474 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1475 | ENABLE_TESTABILITY = YES; 1476 | FRAMEWORK_SEARCH_PATHS = ( 1477 | "$(inherited)", 1478 | "$(PROJECT_DIR)/Carthage/Build/Mac", 1479 | ); 1480 | FRAMEWORK_VERSION = A; 1481 | GCC_C_LANGUAGE_STANDARD = gnu11; 1482 | GCC_DYNAMIC_NO_PIC = NO; 1483 | GCC_NO_COMMON_BLOCKS = YES; 1484 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1485 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1486 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1487 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1488 | GCC_WARN_UNUSED_FUNCTION = YES; 1489 | GCC_WARN_UNUSED_VARIABLE = YES; 1490 | INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Info.plist"; 1491 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1492 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 1493 | MACOSX_DEPLOYMENT_TARGET = 10.10; 1494 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 1495 | MTL_FAST_MATH = YES; 1496 | PRODUCT_BUNDLE_IDENTIFIER = io.github.vbmania.RxValidator; 1497 | PRODUCT_NAME = RxValidator; 1498 | SKIP_INSTALL = YES; 1499 | SUPPORTED_PLATFORMS = macosx; 1500 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 1501 | SWIFT_VERSION = 4.2; 1502 | VERSIONING_SYSTEM = "apple-generic"; 1503 | VERSION_INFO_PREFIX = ""; 1504 | }; 1505 | name = Debug; 1506 | }; 1507 | 9D1550FC2167CE9200C5C889 /* Release */ = { 1508 | isa = XCBuildConfiguration; 1509 | buildSettings = { 1510 | ALWAYS_SEARCH_USER_PATHS = NO; 1511 | CLANG_ANALYZER_NONNULL = YES; 1512 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 1513 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 1514 | CLANG_CXX_LIBRARY = "libc++"; 1515 | CLANG_ENABLE_MODULES = YES; 1516 | CLANG_ENABLE_OBJC_WEAK = YES; 1517 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 1518 | CLANG_WARN_BOOL_CONVERSION = YES; 1519 | CLANG_WARN_COMMA = YES; 1520 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1521 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 1522 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1523 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1524 | CLANG_WARN_EMPTY_BODY = YES; 1525 | CLANG_WARN_ENUM_CONVERSION = YES; 1526 | CLANG_WARN_INFINITE_RECURSION = YES; 1527 | CLANG_WARN_INT_CONVERSION = YES; 1528 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 1529 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 1530 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 1531 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1532 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 1533 | CLANG_WARN_STRICT_PROTOTYPES = YES; 1534 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1535 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 1536 | CLANG_WARN_UNREACHABLE_CODE = YES; 1537 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1538 | CODE_SIGN_IDENTITY = "-"; 1539 | CODE_SIGN_STYLE = Automatic; 1540 | COMBINE_HIDPI_IMAGES = YES; 1541 | COPY_PHASE_STRIP = NO; 1542 | CURRENT_PROJECT_VERSION = 1; 1543 | DEFINES_MODULE = YES; 1544 | DYLIB_COMPATIBILITY_VERSION = 1; 1545 | DYLIB_CURRENT_VERSION = 1; 1546 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1547 | ENABLE_NS_ASSERTIONS = NO; 1548 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1549 | FRAMEWORK_SEARCH_PATHS = ( 1550 | "$(inherited)", 1551 | "$(PROJECT_DIR)/Carthage/Build/Mac", 1552 | ); 1553 | FRAMEWORK_VERSION = A; 1554 | GCC_C_LANGUAGE_STANDARD = gnu11; 1555 | GCC_NO_COMMON_BLOCKS = YES; 1556 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1557 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1558 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1559 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1560 | GCC_WARN_UNUSED_FUNCTION = YES; 1561 | GCC_WARN_UNUSED_VARIABLE = YES; 1562 | INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Info.plist"; 1563 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1564 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 1565 | MACOSX_DEPLOYMENT_TARGET = 10.10; 1566 | MTL_ENABLE_DEBUG_INFO = NO; 1567 | MTL_FAST_MATH = YES; 1568 | PRODUCT_BUNDLE_IDENTIFIER = io.github.vbmania.RxValidator; 1569 | PRODUCT_NAME = RxValidator; 1570 | SKIP_INSTALL = YES; 1571 | SUPPORTED_PLATFORMS = macosx; 1572 | SWIFT_VERSION = 4.2; 1573 | VERSIONING_SYSTEM = "apple-generic"; 1574 | VERSION_INFO_PREFIX = ""; 1575 | }; 1576 | name = Release; 1577 | }; 1578 | 9D53FD052168CFDB00BE3F59 /* Debug */ = { 1579 | isa = XCBuildConfiguration; 1580 | baseConfigurationReference = BE9974B928363AAF2148B96F /* Pods-RxValidatorTests.debug.xcconfig */; 1581 | buildSettings = { 1582 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 1583 | ALWAYS_SEARCH_USER_PATHS = NO; 1584 | CLANG_ANALYZER_NONNULL = YES; 1585 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 1586 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 1587 | CLANG_CXX_LIBRARY = "libc++"; 1588 | CLANG_ENABLE_MODULES = YES; 1589 | CLANG_ENABLE_OBJC_WEAK = YES; 1590 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 1591 | CLANG_WARN_BOOL_CONVERSION = YES; 1592 | CLANG_WARN_COMMA = YES; 1593 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1594 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 1595 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1596 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1597 | CLANG_WARN_EMPTY_BODY = YES; 1598 | CLANG_WARN_ENUM_CONVERSION = YES; 1599 | CLANG_WARN_INFINITE_RECURSION = YES; 1600 | CLANG_WARN_INT_CONVERSION = YES; 1601 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 1602 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 1603 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 1604 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1605 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 1606 | CLANG_WARN_STRICT_PROTOTYPES = YES; 1607 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1608 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 1609 | CLANG_WARN_UNREACHABLE_CODE = YES; 1610 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1611 | CODE_SIGN_IDENTITY = "iPhone Developer"; 1612 | CODE_SIGN_STYLE = Automatic; 1613 | DEVELOPMENT_TEAM = 4U2J29Y5X8; 1614 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1615 | ENABLE_TESTABILITY = YES; 1616 | GCC_C_LANGUAGE_STANDARD = gnu11; 1617 | GCC_DYNAMIC_NO_PIC = NO; 1618 | GCC_NO_COMMON_BLOCKS = YES; 1619 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1620 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1621 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1622 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1623 | GCC_WARN_UNUSED_FUNCTION = YES; 1624 | GCC_WARN_UNUSED_VARIABLE = YES; 1625 | INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Info.plist"; 1626 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 1627 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1628 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 1629 | MTL_FAST_MATH = YES; 1630 | PRODUCT_BUNDLE_IDENTIFIER = io.github.vbmania.RxValidator.Tests; 1631 | PRODUCT_NAME = "$(TARGET_NAME)"; 1632 | PROVISIONING_PROFILE_SPECIFIER = ""; 1633 | SDKROOT = iphoneos; 1634 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 1635 | SWIFT_VERSION = 4.0; 1636 | TARGETED_DEVICE_FAMILY = "1,2"; 1637 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RxValidatorTests Host.app/RxValidatorTests Host"; 1638 | }; 1639 | name = Debug; 1640 | }; 1641 | 9D53FD062168CFDB00BE3F59 /* Release */ = { 1642 | isa = XCBuildConfiguration; 1643 | baseConfigurationReference = 4C33D050AAC5280503861BA4 /* Pods-RxValidatorTests.release.xcconfig */; 1644 | buildSettings = { 1645 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 1646 | ALWAYS_SEARCH_USER_PATHS = NO; 1647 | CLANG_ANALYZER_NONNULL = YES; 1648 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 1649 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 1650 | CLANG_CXX_LIBRARY = "libc++"; 1651 | CLANG_ENABLE_MODULES = YES; 1652 | CLANG_ENABLE_OBJC_WEAK = YES; 1653 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 1654 | CLANG_WARN_BOOL_CONVERSION = YES; 1655 | CLANG_WARN_COMMA = YES; 1656 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1657 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 1658 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1659 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1660 | CLANG_WARN_EMPTY_BODY = YES; 1661 | CLANG_WARN_ENUM_CONVERSION = YES; 1662 | CLANG_WARN_INFINITE_RECURSION = YES; 1663 | CLANG_WARN_INT_CONVERSION = YES; 1664 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 1665 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 1666 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 1667 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1668 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 1669 | CLANG_WARN_STRICT_PROTOTYPES = YES; 1670 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1671 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 1672 | CLANG_WARN_UNREACHABLE_CODE = YES; 1673 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1674 | CODE_SIGN_IDENTITY = "iPhone Developer"; 1675 | CODE_SIGN_STYLE = Automatic; 1676 | COPY_PHASE_STRIP = NO; 1677 | DEVELOPMENT_TEAM = 4U2J29Y5X8; 1678 | ENABLE_NS_ASSERTIONS = NO; 1679 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1680 | GCC_C_LANGUAGE_STANDARD = gnu11; 1681 | GCC_NO_COMMON_BLOCKS = YES; 1682 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1683 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1684 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1685 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1686 | GCC_WARN_UNUSED_FUNCTION = YES; 1687 | GCC_WARN_UNUSED_VARIABLE = YES; 1688 | INFOPLIST_FILE = "$(SRCROOT)/Supporting Files/Info.plist"; 1689 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 1690 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 1691 | MTL_ENABLE_DEBUG_INFO = NO; 1692 | MTL_FAST_MATH = YES; 1693 | PRODUCT_BUNDLE_IDENTIFIER = io.github.vbmania.RxValidator.Tests; 1694 | PRODUCT_NAME = "$(TARGET_NAME)"; 1695 | PROVISIONING_PROFILE_SPECIFIER = ""; 1696 | SDKROOT = iphoneos; 1697 | SWIFT_VERSION = 4.0; 1698 | TARGETED_DEVICE_FAMILY = "1,2"; 1699 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RxValidatorTests Host.app/RxValidatorTests Host"; 1700 | VALIDATE_PRODUCT = YES; 1701 | }; 1702 | name = Release; 1703 | }; 1704 | 9D53FD3C2168D3E700BE3F59 /* Debug */ = { 1705 | isa = XCBuildConfiguration; 1706 | buildSettings = { 1707 | ALWAYS_SEARCH_USER_PATHS = NO; 1708 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 1709 | CLANG_ANALYZER_NONNULL = YES; 1710 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 1711 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 1712 | CLANG_CXX_LIBRARY = "libc++"; 1713 | CLANG_ENABLE_MODULES = YES; 1714 | CLANG_ENABLE_OBJC_WEAK = YES; 1715 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 1716 | CLANG_WARN_BOOL_CONVERSION = YES; 1717 | CLANG_WARN_COMMA = YES; 1718 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1719 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 1720 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1721 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1722 | CLANG_WARN_EMPTY_BODY = YES; 1723 | CLANG_WARN_ENUM_CONVERSION = YES; 1724 | CLANG_WARN_INFINITE_RECURSION = YES; 1725 | CLANG_WARN_INT_CONVERSION = YES; 1726 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 1727 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 1728 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 1729 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1730 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 1731 | CLANG_WARN_STRICT_PROTOTYPES = YES; 1732 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1733 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 1734 | CLANG_WARN_UNREACHABLE_CODE = YES; 1735 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1736 | CODE_SIGN_IDENTITY = "iPhone Developer"; 1737 | CODE_SIGN_STYLE = Automatic; 1738 | DEVELOPMENT_TEAM = 4U2J29Y5X8; 1739 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1740 | ENABLE_TESTABILITY = YES; 1741 | GCC_C_LANGUAGE_STANDARD = gnu11; 1742 | GCC_DYNAMIC_NO_PIC = NO; 1743 | GCC_NO_COMMON_BLOCKS = YES; 1744 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1745 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1746 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1747 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1748 | GCC_WARN_UNUSED_FUNCTION = YES; 1749 | GCC_WARN_UNUSED_VARIABLE = YES; 1750 | INFOPLIST_FILE = "$(SRCROOT)/Tests Host/Supporting Files/Info.plist"; 1751 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 1752 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 1753 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 1754 | MTL_FAST_MATH = YES; 1755 | PRODUCT_BUNDLE_IDENTIFIER = "io.github.vbmania.RxValidator.RxValidatorTests-Host"; 1756 | PRODUCT_NAME = "$(TARGET_NAME)"; 1757 | SDKROOT = iphoneos; 1758 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 1759 | SWIFT_VERSION = 4.0; 1760 | TARGETED_DEVICE_FAMILY = "1,2"; 1761 | }; 1762 | name = Debug; 1763 | }; 1764 | 9D53FD3D2168D3E700BE3F59 /* Release */ = { 1765 | isa = XCBuildConfiguration; 1766 | buildSettings = { 1767 | ALWAYS_SEARCH_USER_PATHS = NO; 1768 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 1769 | CLANG_ANALYZER_NONNULL = YES; 1770 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 1771 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 1772 | CLANG_CXX_LIBRARY = "libc++"; 1773 | CLANG_ENABLE_MODULES = YES; 1774 | CLANG_ENABLE_OBJC_WEAK = YES; 1775 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 1776 | CLANG_WARN_BOOL_CONVERSION = YES; 1777 | CLANG_WARN_COMMA = YES; 1778 | CLANG_WARN_CONSTANT_CONVERSION = YES; 1779 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 1780 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 1781 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 1782 | CLANG_WARN_EMPTY_BODY = YES; 1783 | CLANG_WARN_ENUM_CONVERSION = YES; 1784 | CLANG_WARN_INFINITE_RECURSION = YES; 1785 | CLANG_WARN_INT_CONVERSION = YES; 1786 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 1787 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 1788 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 1789 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 1790 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 1791 | CLANG_WARN_STRICT_PROTOTYPES = YES; 1792 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 1793 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 1794 | CLANG_WARN_UNREACHABLE_CODE = YES; 1795 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 1796 | CODE_SIGN_IDENTITY = "iPhone Developer"; 1797 | CODE_SIGN_STYLE = Automatic; 1798 | COPY_PHASE_STRIP = NO; 1799 | DEVELOPMENT_TEAM = 4U2J29Y5X8; 1800 | ENABLE_NS_ASSERTIONS = NO; 1801 | ENABLE_STRICT_OBJC_MSGSEND = YES; 1802 | GCC_C_LANGUAGE_STANDARD = gnu11; 1803 | GCC_NO_COMMON_BLOCKS = YES; 1804 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 1805 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 1806 | GCC_WARN_UNDECLARED_SELECTOR = YES; 1807 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 1808 | GCC_WARN_UNUSED_FUNCTION = YES; 1809 | GCC_WARN_UNUSED_VARIABLE = YES; 1810 | INFOPLIST_FILE = "$(SRCROOT)/Tests Host/Supporting Files/Info.plist"; 1811 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 1812 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 1813 | MTL_ENABLE_DEBUG_INFO = NO; 1814 | MTL_FAST_MATH = YES; 1815 | PRODUCT_BUNDLE_IDENTIFIER = "io.github.vbmania.RxValidator.RxValidatorTests-Host"; 1816 | PRODUCT_NAME = "$(TARGET_NAME)"; 1817 | SDKROOT = iphoneos; 1818 | SWIFT_VERSION = 4.0; 1819 | TARGETED_DEVICE_FAMILY = "1,2"; 1820 | VALIDATE_PRODUCT = YES; 1821 | }; 1822 | name = Release; 1823 | }; 1824 | OBJ_3 /* Debug */ = { 1825 | isa = XCBuildConfiguration; 1826 | buildSettings = { 1827 | CLANG_ENABLE_OBJC_ARC = YES; 1828 | COMBINE_HIDPI_IMAGES = YES; 1829 | COPY_PHASE_STRIP = NO; 1830 | DEBUG_INFORMATION_FORMAT = dwarf; 1831 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1832 | ENABLE_NS_ASSERTIONS = YES; 1833 | GCC_OPTIMIZATION_LEVEL = 0; 1834 | GCC_PREPROCESSOR_DEFINITIONS = ( 1835 | "DEBUG=1", 1836 | "$(inherited)", 1837 | ); 1838 | MACOSX_DEPLOYMENT_TARGET = 10.10; 1839 | ONLY_ACTIVE_ARCH = YES; 1840 | OTHER_SWIFT_FLAGS = "-DXcode"; 1841 | PRODUCT_NAME = "$(TARGET_NAME)"; 1842 | SDKROOT = macosx; 1843 | SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator appletvos appletvsimulator watchos watchsimulator"; 1844 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "SWIFT_PACKAGE DEBUG"; 1845 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 1846 | USE_HEADERMAP = NO; 1847 | }; 1848 | name = Debug; 1849 | }; 1850 | OBJ_4 /* Release */ = { 1851 | isa = XCBuildConfiguration; 1852 | buildSettings = { 1853 | CLANG_ENABLE_OBJC_ARC = YES; 1854 | COMBINE_HIDPI_IMAGES = YES; 1855 | COPY_PHASE_STRIP = YES; 1856 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 1857 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1858 | GCC_OPTIMIZATION_LEVEL = s; 1859 | MACOSX_DEPLOYMENT_TARGET = 10.10; 1860 | OTHER_SWIFT_FLAGS = "-DXcode"; 1861 | PRODUCT_NAME = "$(TARGET_NAME)"; 1862 | SDKROOT = macosx; 1863 | SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator appletvos appletvsimulator watchos watchsimulator"; 1864 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = SWIFT_PACKAGE; 1865 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 1866 | USE_HEADERMAP = NO; 1867 | }; 1868 | name = Release; 1869 | }; 1870 | /* End XCBuildConfiguration section */ 1871 | 1872 | /* Begin XCConfigurationList section */ 1873 | 9D1550D32167CE4900C5C889 /* Build configuration list for PBXNativeTarget "RxValidator iOS" */ = { 1874 | isa = XCConfigurationList; 1875 | buildConfigurations = ( 1876 | 9D1550D42167CE4900C5C889 /* Debug */, 1877 | 9D1550D52167CE4900C5C889 /* Release */, 1878 | ); 1879 | defaultConfigurationIsVisible = 0; 1880 | defaultConfigurationName = Release; 1881 | }; 1882 | 9D1550E02167CE6C00C5C889 /* Build configuration list for PBXNativeTarget "RxValidator watchOS" */ = { 1883 | isa = XCConfigurationList; 1884 | buildConfigurations = ( 1885 | 9D1550E12167CE6C00C5C889 /* Debug */, 1886 | 9D1550E22167CE6C00C5C889 /* Release */, 1887 | ); 1888 | defaultConfigurationIsVisible = 0; 1889 | defaultConfigurationName = Release; 1890 | }; 1891 | 9D1550ED2167CE7900C5C889 /* Build configuration list for PBXNativeTarget "RxValidator tvOS" */ = { 1892 | isa = XCConfigurationList; 1893 | buildConfigurations = ( 1894 | 9D1550EE2167CE7900C5C889 /* Debug */, 1895 | 9D1550EF2167CE7900C5C889 /* Release */, 1896 | ); 1897 | defaultConfigurationIsVisible = 0; 1898 | defaultConfigurationName = Release; 1899 | }; 1900 | 9D1550FA2167CE9200C5C889 /* Build configuration list for PBXNativeTarget "RxValidator macOS" */ = { 1901 | isa = XCConfigurationList; 1902 | buildConfigurations = ( 1903 | 9D1550FB2167CE9200C5C889 /* Debug */, 1904 | 9D1550FC2167CE9200C5C889 /* Release */, 1905 | ); 1906 | defaultConfigurationIsVisible = 0; 1907 | defaultConfigurationName = Release; 1908 | }; 1909 | 9D53FD072168CFDB00BE3F59 /* Build configuration list for PBXNativeTarget "RxValidatorTests" */ = { 1910 | isa = XCConfigurationList; 1911 | buildConfigurations = ( 1912 | 9D53FD052168CFDB00BE3F59 /* Debug */, 1913 | 9D53FD062168CFDB00BE3F59 /* Release */, 1914 | ); 1915 | defaultConfigurationIsVisible = 0; 1916 | defaultConfigurationName = Release; 1917 | }; 1918 | 9D53FD3B2168D3E700BE3F59 /* Build configuration list for PBXNativeTarget "RxValidatorTests Host" */ = { 1919 | isa = XCConfigurationList; 1920 | buildConfigurations = ( 1921 | 9D53FD3C2168D3E700BE3F59 /* Debug */, 1922 | 9D53FD3D2168D3E700BE3F59 /* Release */, 1923 | ); 1924 | defaultConfigurationIsVisible = 0; 1925 | defaultConfigurationName = Release; 1926 | }; 1927 | OBJ_2 /* Build configuration list for PBXProject "RxValidator" */ = { 1928 | isa = XCConfigurationList; 1929 | buildConfigurations = ( 1930 | OBJ_3 /* Debug */, 1931 | OBJ_4 /* Release */, 1932 | ); 1933 | defaultConfigurationIsVisible = 0; 1934 | defaultConfigurationName = Release; 1935 | }; 1936 | /* End XCConfigurationList section */ 1937 | }; 1938 | rootObject = OBJ_1 /* Project object */; 1939 | } 1940 | -------------------------------------------------------------------------------- /RxValidator.xcodeproj/xcshareddata/xcschemes/RxValidator iOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 32 | 33 | 39 | 40 | 41 | 42 | 44 | 50 | 51 | 52 | 53 | 54 | 60 | 61 | 62 | 63 | 64 | 65 | 75 | 76 | 82 | 83 | 84 | 85 | 86 | 87 | 93 | 94 | 100 | 101 | 102 | 103 | 105 | 106 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /RxValidator.xcodeproj/xcshareddata/xcschemes/RxValidator macOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 55 | 61 | 62 | 63 | 64 | 65 | 66 | 72 | 73 | 79 | 80 | 81 | 82 | 84 | 85 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /RxValidator.xcodeproj/xcshareddata/xcschemes/RxValidator tvOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 55 | 61 | 62 | 63 | 64 | 65 | 66 | 72 | 73 | 79 | 80 | 81 | 82 | 84 | 85 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /RxValidator.xcodeproj/xcshareddata/xcschemes/RxValidator watchOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 39 | 40 | 41 | 42 | 43 | 44 | 54 | 55 | 61 | 62 | 63 | 64 | 65 | 66 | 72 | 73 | 79 | 80 | 81 | 82 | 84 | 85 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /Sources/Validate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Validate.swift 3 | // RxValidator 4 | // 5 | // Created by 유금상 on 2018. 6. 20.. 6 | // 7 | 8 | import Foundation 9 | import RxSwift 10 | 11 | public final class Validate { 12 | public static func to(_ value: String) -> StringValidationTarget { 13 | return StringValidationTarget(value) 14 | } 15 | 16 | public static func to(_ value: T) -> NumberValidationTarget { 17 | return NumberValidationTarget(value) 18 | } 19 | 20 | public static func to(_ value: Date, granularity: Calendar.Component) -> DateValidationTarget { 21 | return DateValidationTarget(value, granularity: granularity) 22 | } 23 | 24 | public static func to(_ value: Date) -> DateValidationTarget { 25 | return DateValidationTarget(value) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Sources/ValidationTarget/DateValidationTarget.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DateValidationTarget.swift 3 | // RxValidator 4 | // 5 | // Created by 유금상 on 2018. 5. 30.. 6 | // 7 | 8 | import Foundation 9 | import RxSwift 10 | 11 | public final class DateValidationTarget: ValidationTarget { 12 | public typealias TargetType = Date 13 | public typealias ValidatorType = DateValidator 14 | 15 | private let granularity: Calendar.Component 16 | 17 | public let value: Date 18 | public var result: Observable? 19 | 20 | required public init(_ value: Date) { 21 | self.value = value 22 | self.granularity = Calendar.Component.minute 23 | } 24 | 25 | required public init(_ value: Date, granularity: Calendar.Component) { 26 | self.value = value 27 | self.granularity = granularity 28 | } 29 | 30 | public func validate(_ validator: DateValidator) -> Self { 31 | guard self.result == nil else { 32 | return self 33 | } 34 | 35 | do { 36 | try validator.validate(value, granularity: granularity) 37 | } catch { 38 | result = Observable.error(error) 39 | } 40 | 41 | return self 42 | } 43 | 44 | public func validate(_ condition: ValidatorInstanceCondition, message: String? = nil) -> Self { 45 | guard self.result == nil else { 46 | return self 47 | } 48 | 49 | if !condition(value) { 50 | if let msg = message { 51 | self.result = Observable.error(RxValidatorResult.notValidWithMessage(message: msg)) 52 | } else { 53 | self.result = Observable.error(RxValidatorResult.notValid) 54 | } 55 | } 56 | 57 | return self 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /Sources/ValidationTarget/NumberValidationTarget.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NumberValidationTarget.swift 3 | // RxValidator 4 | // 5 | // Created by 유금상 on 2018. 5. 30.. 6 | // 7 | 8 | import Foundation 9 | import RxSwift 10 | 11 | public final class NumberValidationTarget: ValidationTarget { 12 | public typealias TargetType = T 13 | public typealias ValidatorType = NumberValidator 14 | 15 | public let value: T 16 | public var result: Observable? 17 | 18 | required public init(_ value: T) { 19 | self.value = value 20 | } 21 | 22 | public func validate(_ validator: NumberValidator) -> Self { 23 | guard self.result == nil else { 24 | return self 25 | } 26 | 27 | do { 28 | try validator.validate(value) 29 | } catch { 30 | result = Observable.error(error) 31 | } 32 | 33 | return self 34 | } 35 | 36 | public func validate(_ condition: ValidatorInstanceCondition, message: String? = nil) -> Self { 37 | guard self.result == nil else { 38 | return self 39 | } 40 | 41 | if !condition(value) { 42 | if let msg = message { 43 | self.result = Observable.error(RxValidatorResult.notValidWithMessage(message: msg)) 44 | } else { 45 | self.result = Observable.error(RxValidatorResult.notValid) 46 | } 47 | } 48 | 49 | return self 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /Sources/ValidationTarget/StringValidationTarget.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StringValidatorType.swift 3 | // RxValidator 4 | // 5 | // Created by 유금상 on 2018. 5. 30.. 6 | // 7 | 8 | import Foundation 9 | import RxSwift 10 | 11 | public final class StringValidationTarget: ValidationTarget { 12 | 13 | public typealias TargetType = String 14 | public typealias ValidatorType = StringValidator 15 | 16 | public let value: TargetType 17 | public var result: Observable? 18 | 19 | required public init(_ value: TargetType) { 20 | self.value = value 21 | } 22 | 23 | public func validate(_ validator: StringValidator) -> Self { 24 | guard self.result == nil else { 25 | return self 26 | } 27 | 28 | do { 29 | try validator.validate(value) 30 | } catch { 31 | result = Observable.error(error) 32 | } 33 | 34 | return self 35 | } 36 | 37 | public func validate(_ condition: ValidatorInstanceCondition, message: String? = nil) -> Self { 38 | guard self.result == nil else { 39 | return self 40 | } 41 | 42 | if !condition(value) { 43 | if let msg = message { 44 | self.result = Observable.error(RxValidatorResult.notValidWithMessage(message: msg)) 45 | } else { 46 | self.result = Observable.error(RxValidatorResult.notValid) 47 | } 48 | } 49 | 50 | return self 51 | } 52 | 53 | } 54 | -------------------------------------------------------------------------------- /Sources/extensions/Observable+Date+Extension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Observable+Date+Extension.swift 3 | // RxValidator 4 | // 5 | // Created by 유금상 on 2018. 6. 21.. 6 | // 7 | 8 | import Foundation 9 | import RxSwift 10 | 11 | extension Observable where Element == Date { 12 | public func validate(_ validator: DateValidator, message: String? = nil) -> Observable { 13 | return self.map { 14 | do { 15 | try validator.validate($0, granularity: .nanosecond) 16 | } catch { 17 | if let msg = message { 18 | throw RxValidatorResult.notValidWithMessage(message: msg) 19 | } else { 20 | throw error 21 | } 22 | } 23 | return $0 24 | } 25 | } 26 | 27 | public func validate(_ condition: @escaping (Date) -> Bool, message: String? = nil) -> Observable { 28 | 29 | return self.map { 30 | if !condition($0) { 31 | if let msg = message { 32 | throw RxValidatorResult.notValidWithMessage(message: msg) 33 | } else { 34 | throw RxValidatorResult.notValid 35 | } 36 | } 37 | return $0 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Sources/extensions/Observable+Number+Extension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Observable+Number+Extension.swift 3 | // RxValidator 4 | // 5 | // Created by 유금상 on 2018. 6. 20.. 6 | // 7 | 8 | import Foundation 9 | import RxSwift 10 | 11 | extension Observable where Element: Numeric { 12 | public func validate(_ validator: NumberValidator, message: String? = nil) -> Observable { 13 | return self.map { 14 | do { 15 | try validator.validate($0) 16 | } catch { 17 | if let msg = message { 18 | throw RxValidatorResult.notValidWithMessage(message: msg) 19 | } else { 20 | throw error 21 | } 22 | } 23 | return $0 24 | } 25 | } 26 | 27 | public func validate(_ condition: @escaping (Element) -> Bool, message: String? = nil) -> Observable { 28 | 29 | return self.map { 30 | if !condition($0) { 31 | if let msg = message { 32 | throw RxValidatorResult.notValidWithMessage(message: msg) 33 | } else { 34 | throw RxValidatorResult.notValid 35 | } 36 | } 37 | return $0 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /Sources/extensions/Observable+String+Extension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Observable+String+Extension.swift 3 | // RxValidator 4 | // 5 | // Created by 유금상 on 2018. 6. 20.. 6 | // 7 | 8 | import Foundation 9 | import RxSwift 10 | 11 | extension Observable where Element == String { 12 | public func validate(_ validator: StringValidator, message: String? = nil) -> Observable { 13 | return self.map { 14 | do { 15 | try validator.validate($0) 16 | } catch { 17 | if let msg = message { 18 | throw RxValidatorResult.notValidWithMessage(message: msg) 19 | } else { 20 | throw error 21 | } 22 | } 23 | return $0 24 | } 25 | } 26 | 27 | public func validate(_ condition: @escaping (String) -> Bool, message: String? = nil) -> Observable { 28 | return self.map { 29 | if !condition($0) { 30 | if let msg = message { 31 | throw RxValidatorResult.notValidWithMessage(message: msg) 32 | } else { 33 | throw RxValidatorResult.notValid 34 | } 35 | } 36 | return $0 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Sources/protocols/ValidationTarget.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ValidationTarget.swift 3 | // RxValidator 4 | // 5 | // Created by 유금상 on 2018. 5. 30.. 6 | // 7 | 8 | import Foundation 9 | import RxSwift 10 | 11 | public protocol ValidationTarget { 12 | associatedtype TargetType 13 | associatedtype ValidatorType 14 | 15 | typealias ValidatorInstanceCondition = (TargetType) -> Bool 16 | 17 | var value: TargetType { get } 18 | var result: Observable? { get } 19 | 20 | func validate(_ validator: ValidatorType) -> Self 21 | func validate(_ condition: ValidatorInstanceCondition, message: String?) -> Self 22 | func asObservable() -> Observable 23 | func check() -> RxValidatorResult 24 | } 25 | 26 | extension ValidationTarget { 27 | 28 | public func asObservable() -> Observable { 29 | if let result = self.result { 30 | return result 31 | } 32 | return Observable.just(value) 33 | } 34 | 35 | public func check() -> RxValidatorResult { 36 | if let result = self.result { 37 | var validationError: RxValidatorResult? 38 | 39 | _ = result.asSingle().subscribe(onError: { (error) in 40 | validationError = RxValidatorResult.determine(error: error) 41 | }) 42 | 43 | return validationError ?? .valid 44 | } 45 | 46 | return .valid 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /Sources/result/RxValidatorResult.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RxValidatorResult.swift 3 | // RxValidator 4 | // 5 | // Created by 유금상 on 2018. 5. 30.. 6 | // 7 | 8 | import Foundation 9 | 10 | public enum RxValidatorResult: Error, Equatable { 11 | case valid 12 | case notValid 13 | case notValidWithMessage(message: String) 14 | case notValidWithCode(code: Int) 15 | 16 | case undefinedError 17 | 18 | case notEqualString 19 | case stringIsUnderflow 20 | case stringIsOverflow 21 | case stringIsEmpty 22 | case stringIsNotMatch 23 | 24 | case notEqualNumber 25 | case notLessThenNumber 26 | case notGreaterThanNumber 27 | case notEvenNumber 28 | 29 | case invalidateDateTerm 30 | case notBeforeDate 31 | case notAfterDate 32 | case notEqualDate 33 | 34 | public static func ==(lhs: RxValidatorResult, rhs: RxValidatorResult) -> Bool { 35 | switch (lhs, rhs){ 36 | case (.valid, .valid): 37 | return true 38 | case (.notValid, .notValid): 39 | return true 40 | case (.notValidWithMessage(let lvalue), .notValidWithMessage(let rvalue)): 41 | return lvalue == rvalue 42 | case (.notValidWithCode(let lvalue), .notValidWithCode(let rvalue)): 43 | return lvalue == rvalue 44 | case (.undefinedError, .undefinedError): 45 | return true 46 | case (.notEqualString, .notEqualString): 47 | return true 48 | case (.stringIsUnderflow, .stringIsUnderflow): 49 | return true 50 | case (.stringIsOverflow, .stringIsOverflow): 51 | return true 52 | case (.stringIsEmpty, .stringIsEmpty): 53 | return true 54 | case (.stringIsNotMatch, .stringIsNotMatch): 55 | return true 56 | case (.notEqualNumber, .notEqualNumber): 57 | return true 58 | case (.notLessThenNumber, .notLessThenNumber): 59 | return true 60 | case (.notGreaterThanNumber, .notGreaterThanNumber): 61 | return true 62 | case (.notEvenNumber, .notEvenNumber): 63 | return true 64 | case (.invalidateDateTerm, .invalidateDateTerm): 65 | return true 66 | case (.notBeforeDate, .notBeforeDate): 67 | return true 68 | case (.notAfterDate, .notAfterDate): 69 | return true 70 | case (.notEqualDate, .notEqualDate): 71 | return true 72 | default: 73 | break 74 | } 75 | return false 76 | } 77 | 78 | public static func determine(error: Error) -> RxValidatorResult { 79 | if let validateError = error as? RxValidatorResult { 80 | return validateError 81 | } 82 | 83 | return .undefinedError 84 | } 85 | 86 | public func getCode() -> Int? { 87 | switch self { 88 | case .notValidWithCode(let code): 89 | return code 90 | default: 91 | return nil 92 | } 93 | } 94 | 95 | public func getMessage() -> String? { 96 | switch self { 97 | case .notValidWithMessage(let msg): 98 | return msg 99 | default: 100 | return nil 101 | } 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /Sources/rules/Date/DateShouldAfterOrSameThen.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DateShouldAfterOrSameThen.swift 3 | // RxValidator 4 | // 5 | // Created by Kawoou on 06/10/2018. 6 | // 7 | 8 | import Foundation 9 | 10 | private final class DateShouldAfterOrSameThen: DateValidator { 11 | let date: Date 12 | 13 | init(_ date: Date) { 14 | self.date = date 15 | } 16 | override func validate(_ value: Date, granularity: Calendar.Component) throws { 17 | let calendar = Calendar(identifier: .gregorian) 18 | let result = calendar.compare(value, to: date, toGranularity: granularity) 19 | 20 | if result == .orderedAscending { 21 | throw RxValidatorResult.notAfterDate 22 | } 23 | } 24 | } 25 | 26 | extension DateValidator { 27 | public static func shouldAfterOrSameThen(_ date: Date) -> DateValidator { 28 | return DateShouldAfterOrSameThen(date) 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Sources/rules/Date/DateShouldAfterThen.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DateShouldAfterThen.swift 3 | // RxValidator 4 | // 5 | // Created by Kawoou on 06/10/2018. 6 | // 7 | 8 | import Foundation 9 | 10 | private final class DateShouldAfterThen: DateValidator { 11 | let date: Date 12 | 13 | init(_ date: Date) { 14 | self.date = date 15 | } 16 | override func validate(_ value: Date, granularity: Calendar.Component) throws { 17 | let calendar = Calendar(identifier: .gregorian) 18 | let result = calendar.compare(value, to: date, toGranularity: granularity) 19 | 20 | if result != .orderedDescending { 21 | throw RxValidatorResult.notAfterDate 22 | } 23 | } 24 | } 25 | 26 | extension DateValidator { 27 | public static func shouldAfterThen(_ date: Date) -> DateValidator { 28 | return DateShouldAfterThen(date) 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Sources/rules/Date/DateShouldBeCloseDates.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DateShouldBeCloseDates.swift 3 | // RxValidator 4 | // 5 | // Created by Kawoou on 06/10/2018. 6 | // 7 | 8 | import Foundation 9 | 10 | private final class DateShouldBeCloseDates: DateValidator { 11 | let date: Date 12 | let termOfDays: Int 13 | 14 | init(_ date: Date, termOfDays: Int) { 15 | self.date = date 16 | self.termOfDays = termOfDays 17 | } 18 | override func validate(_ value: Date, granularity: Calendar.Component) throws { 19 | let beforeDate = min(value, date) 20 | let afterDate = max(value, date) 21 | 22 | let oneDay: Int = 60 * 60 * 24 23 | let targetDate = beforeDate.addingTimeInterval(TimeInterval(oneDay * termOfDays)) 24 | 25 | if targetDate < afterDate { 26 | throw RxValidatorResult.invalidateDateTerm 27 | } 28 | } 29 | } 30 | 31 | extension DateValidator { 32 | public static func shouldBeCloseDates(_ date: Date, termOfDays: Int) -> DateValidator { 33 | return DateShouldBeCloseDates(date, termOfDays: termOfDays) 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Sources/rules/Date/DateShouldBeforeOrSameThen.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DateShouldBeforeOrSameThen.swift 3 | // RxValidator 4 | // 5 | // Created by Kawoou on 06/10/2018. 6 | // 7 | 8 | import Foundation 9 | 10 | private final class DateShouldBeforeOrSameThen: DateValidator { 11 | let date: Date 12 | 13 | init(_ date: Date) { 14 | self.date = date 15 | } 16 | override func validate(_ value: Date, granularity: Calendar.Component) throws { 17 | let calendar = Calendar(identifier: .gregorian) 18 | let result = calendar.compare(value, to: date, toGranularity: granularity) 19 | 20 | if result == .orderedDescending { 21 | throw RxValidatorResult.notBeforeDate 22 | } 23 | } 24 | } 25 | 26 | extension DateValidator { 27 | public static func shouldBeforeOrSameThen(_ date: Date) -> DateValidator { 28 | return DateShouldBeforeOrSameThen(date) 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Sources/rules/Date/DateShouldBeforeThen.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DateShouldBeforeThen.swift 3 | // RxValidator 4 | // 5 | // Created by Kawoou on 06/10/2018. 6 | // 7 | 8 | import Foundation 9 | 10 | private final class DateShouldBeforeThen: DateValidator { 11 | let date: Date 12 | 13 | init(_ date: Date) { 14 | self.date = date 15 | } 16 | override func validate(_ value: Date, granularity: Calendar.Component) throws { 17 | let calendar = Calendar(identifier: .gregorian) 18 | let result = calendar.compare(value, to: date, toGranularity: granularity) 19 | 20 | if result != .orderedAscending { 21 | throw RxValidatorResult.notBeforeDate 22 | } 23 | } 24 | } 25 | 26 | extension DateValidator { 27 | public static func shouldBeforeThen(_ date: Date) -> DateValidator { 28 | return DateShouldBeforeThen(date) 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Sources/rules/Date/DateShouldEqualTo.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DateShouldEqualTo.swift 3 | // RxValidator 4 | // 5 | // Created by Kawoou on 06/10/2018. 6 | // 7 | 8 | import Foundation 9 | 10 | private final class DateShouldEqualTo: DateValidator { 11 | let date: Date 12 | 13 | init(_ date: Date) { 14 | self.date = date 15 | } 16 | override func validate(_ value: Date, granularity: Calendar.Component) throws { 17 | let calendar = Calendar(identifier: .gregorian) 18 | let result = calendar.compare(value, to: date, toGranularity: granularity) 19 | 20 | if result != .orderedSame { 21 | throw RxValidatorResult.notEqualDate 22 | } 23 | } 24 | } 25 | 26 | extension DateValidator { 27 | public static func shouldEqualTo(_ date: Date) -> DateValidator { 28 | return DateShouldEqualTo(date) 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Sources/rules/DateValidator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DateValidator.swift 3 | // RxValidator 4 | // 5 | // Created by Kawoou on 06/10/2018. 6 | // 7 | 8 | import Foundation 9 | 10 | public class DateValidator { 11 | public func validate(_ value: Date, granularity: Calendar.Component = .minute) throws {} 12 | 13 | init() {} 14 | } 15 | -------------------------------------------------------------------------------- /Sources/rules/Number/IntShouldBeEven.swift: -------------------------------------------------------------------------------- 1 | // 2 | // IntShouldBeEven.swift 3 | // RxValidator 4 | // 5 | // Created by 유금상 on 2018. 6. 20.. 6 | // 7 | 8 | final class IntShouldBeEven: NumberValidator { 9 | override func validate(_ value: Int) throws { 10 | if (value % 2) != 0 { 11 | throw RxValidatorResult.notEvenNumber 12 | } 13 | } 14 | } 15 | 16 | extension NumberValidator where T == Int { 17 | public static var shouldBeEven: NumberValidator { 18 | return IntShouldBeEven() 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/rules/Number/NumberShouldEqualTo.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NumberShouldEqualTo.swift 3 | // RxValidator 4 | // 5 | // Created by Kawoou on 06/10/2018. 6 | // 7 | 8 | private final class NumberShouldEqualTo: NumberValidator { 9 | let number: T 10 | 11 | init(_ number: T) { 12 | self.number = number 13 | } 14 | override func validate(_ value: T) throws { 15 | if value != number { 16 | throw RxValidatorResult.notEqualNumber 17 | } 18 | } 19 | } 20 | 21 | extension NumberValidator { 22 | public static func shouldEqualTo(_ number: T) -> NumberValidator { 23 | return NumberShouldEqualTo(number) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Sources/rules/Number/NumberShouldGreaterThan.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NumberShouldGreaterThan.swift 3 | // RxValidator 4 | // 5 | // Created by Kawoou on 06/10/2018. 6 | // 7 | 8 | private final class NumberShouldGreaterThan: NumberValidator { 9 | let number: T 10 | 11 | init(_ number: T) { 12 | self.number = number 13 | } 14 | override func validate(_ value: T) throws { 15 | if value <= number { 16 | throw RxValidatorResult.notGreaterThanNumber 17 | } 18 | } 19 | } 20 | 21 | extension NumberValidator where T: Numeric & Comparable { 22 | public static func shouldGreaterThan(_ value: T) -> NumberValidator { 23 | return NumberShouldGreaterThan(value) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Sources/rules/Number/NumberShouldLessThan.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NumberShouldLessThan.swift 3 | // RxValidator 4 | // 5 | // Created by Kawoou on 06/10/2018. 6 | // 7 | 8 | private final class NumberShouldLessThan: NumberValidator { 9 | let number: T 10 | 11 | init(_ number: T) { 12 | self.number = number 13 | } 14 | override func validate(_ value: T) throws { 15 | if value >= number { 16 | throw RxValidatorResult.notLessThenNumber 17 | } 18 | } 19 | } 20 | 21 | extension NumberValidator where T: Numeric & Comparable { 22 | public static func shouldLessThan(_ value: T) -> NumberValidator { 23 | return NumberShouldLessThan(value) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Sources/rules/NumberValidator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NumberValidator.swift 3 | // RxValidator iOS 4 | // 5 | // Created by Kawoou on 06/10/2018. 6 | // 7 | 8 | public class NumberValidator { 9 | public func validate(_ value: T) throws {} 10 | 11 | init() {} 12 | } 13 | -------------------------------------------------------------------------------- /Sources/rules/String/StringIsAlwaysPass.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StringIsAlwaysPass.swift 3 | // Nimble 4 | // 5 | // Created by 유금상 on 2018. 6. 20.. 6 | // 7 | 8 | private final class StringIsAlwaysPass: StringValidator { 9 | override func validate(_ value: String) throws { 10 | //do nothing.. 11 | } 12 | } 13 | 14 | extension StringValidator { 15 | public static var isAlwaysPass: StringValidator { 16 | return StringIsAlwaysPass() 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Sources/rules/String/StringIsNotOverflowThen.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StringIsNotOverflowThen.swift 3 | // RxValidator 4 | // 5 | // Created by 유금상 on 2018. 5. 30.. 6 | // 7 | 8 | private final class StringIsNotOverflowThen: StringValidator { 9 | let maxLength: Int 10 | 11 | init(maxLength: Int) { 12 | self.maxLength = maxLength 13 | } 14 | 15 | override func validate(_ value: String) throws { 16 | if value.count > maxLength { 17 | throw RxValidatorResult.stringIsOverflow 18 | } 19 | } 20 | } 21 | 22 | extension StringValidator { 23 | public static func isNotOverflowThen(max length: Int) -> StringValidator { 24 | return StringIsNotOverflowThen(maxLength: length) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Sources/rules/String/StringIsNotUnderflowThen.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StringIsNotUnderflowThen.swift 3 | // RxValidator 4 | // 5 | // Created by Kawoou on 06/10/2018. 6 | // 7 | 8 | private final class StringIsNotUnderflowThen: StringValidator { 9 | let minLength: Int 10 | 11 | init(minLength: Int) { 12 | self.minLength = minLength 13 | } 14 | 15 | override func validate(_ value: String) throws { 16 | if value.count < minLength { 17 | throw RxValidatorResult.stringIsUnderflow 18 | } 19 | } 20 | } 21 | 22 | extension StringValidator { 23 | public static func isNotUnderflowThen(min length: Int) -> StringValidator { 24 | return StringIsNotUnderflowThen(minLength: length) 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Sources/rules/String/StringShouldBeMatch.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StringShouldBeMatch.swift 3 | // RxValidator 4 | // 5 | // Created by 유금상 on 2018. 6. 18.. 6 | // 7 | 8 | private final class StringShouldBeMatch: StringValidator { 9 | let regex: NSRegularExpression? 10 | 11 | init(_ regex: String) { 12 | self.regex = try? NSRegularExpression(pattern: regex, options: .caseInsensitive) 13 | } 14 | 15 | override func validate(_ value: String) throws { 16 | if let _ = regex?.firstMatch(in: value, options: NSRegularExpression.MatchingOptions.reportCompletion, range: NSRange(location: 0, length: value.count)) { 17 | return 18 | } 19 | throw RxValidatorResult.stringIsNotMatch 20 | } 21 | } 22 | 23 | extension StringValidator { 24 | public static func shouldBeMatch(_ regex: String) -> StringValidator { 25 | return StringShouldBeMatch(regex) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Sources/rules/String/StringShouldEqualTo.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StringShouldEqualTo.swift 3 | // RxValidator iOS 4 | // 5 | // Created by Kawoou on 06/10/2018. 6 | // 7 | 8 | import Foundation 9 | 10 | private final class StringShouldEqualTo: StringValidator { 11 | let string: String 12 | 13 | init(_ string: String) { 14 | self.string = string 15 | } 16 | override func validate(_ value: String) throws { 17 | if value != string { 18 | throw RxValidatorResult.notEqualString 19 | } 20 | } 21 | } 22 | 23 | extension StringValidator { 24 | public static func shouldEqualTo(_ string: String) -> StringValidator { 25 | return StringShouldEqualTo(string) 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Sources/rules/String/StringShouldNotBeEmpty.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StringShouldNotBeEmpty.swift 3 | // RxValidator 4 | // 5 | // Created by 유금상 on 2018. 5. 30.. 6 | // 7 | 8 | private final class StringShouldNotBeEmpty: StringValidator { 9 | override func validate(_ value: String) throws { 10 | if value.isEmpty || value.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty { 11 | throw RxValidatorResult.stringIsEmpty 12 | } 13 | } 14 | } 15 | 16 | extension StringValidator { 17 | public static var shouldNotBeEmpty: StringValidator { 18 | return StringShouldNotBeEmpty() 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Sources/rules/StringValidator.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StringValidator.swift 3 | // RxValidator 4 | // 5 | // Created by Kawoou on 06/10/2018. 6 | // 7 | 8 | public class StringValidator { 9 | public func validate(_ value: String) throws {} 10 | 11 | init() {} 12 | } 13 | -------------------------------------------------------------------------------- /Supporting Files/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | 22 | 23 | -------------------------------------------------------------------------------- /Supporting Files/RxValidator.h: -------------------------------------------------------------------------------- 1 | // 2 | // RxValidator.h 3 | // RxValidator 4 | // 5 | // Created by Kawoou on 06/10/2018. 6 | // 7 | 8 | #import 9 | 10 | //! Project version number for RxValidator_iOS. 11 | FOUNDATION_EXPORT double RxValidatorVersionNumber; 12 | 13 | //! Project version string for RxValidator_iOS. 14 | FOUNDATION_EXPORT const unsigned char RxValidatorVersionString[]; 15 | 16 | // In this header, you should import all the public headers of your framework using statements like #import 17 | 18 | 19 | -------------------------------------------------------------------------------- /Tests Host/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ipad", 45 | "size" : "20x20", 46 | "scale" : "1x" 47 | }, 48 | { 49 | "idiom" : "ipad", 50 | "size" : "20x20", 51 | "scale" : "2x" 52 | }, 53 | { 54 | "idiom" : "ipad", 55 | "size" : "29x29", 56 | "scale" : "1x" 57 | }, 58 | { 59 | "idiom" : "ipad", 60 | "size" : "29x29", 61 | "scale" : "2x" 62 | }, 63 | { 64 | "idiom" : "ipad", 65 | "size" : "40x40", 66 | "scale" : "1x" 67 | }, 68 | { 69 | "idiom" : "ipad", 70 | "size" : "40x40", 71 | "scale" : "2x" 72 | }, 73 | { 74 | "idiom" : "ipad", 75 | "size" : "76x76", 76 | "scale" : "1x" 77 | }, 78 | { 79 | "idiom" : "ipad", 80 | "size" : "76x76", 81 | "scale" : "2x" 82 | }, 83 | { 84 | "idiom" : "ipad", 85 | "size" : "83.5x83.5", 86 | "scale" : "2x" 87 | }, 88 | { 89 | "idiom" : "ios-marketing", 90 | "size" : "1024x1024", 91 | "scale" : "1x" 92 | } 93 | ], 94 | "info" : { 95 | "version" : 1, 96 | "author" : "xcode" 97 | } 98 | } -------------------------------------------------------------------------------- /Tests Host/Resources/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /Tests Host/Resources/Base.lproj/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /Tests Host/Resources/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Tests Host/Sources/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // RxValidatorExample 4 | // 5 | // Created by 유금상 on 2018. 6. 14.. 6 | // Copyright © 2018년 유금상. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 18 | // Override point for customization after application launch. 19 | return true 20 | } 21 | 22 | func applicationWillResignActive(_ application: UIApplication) { 23 | // 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. 24 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. 25 | } 26 | 27 | func applicationDidEnterBackground(_ application: UIApplication) { 28 | // 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. 29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 30 | } 31 | 32 | func applicationWillEnterForeground(_ application: UIApplication) { 33 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. 34 | } 35 | 36 | func applicationDidBecomeActive(_ application: UIApplication) { 37 | // 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. 38 | } 39 | 40 | func applicationWillTerminate(_ application: UIApplication) { 41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 42 | } 43 | 44 | 45 | } 46 | 47 | -------------------------------------------------------------------------------- /Tests Host/Sources/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // RxValidatorExample 4 | // 5 | // Created by 유금상 on 2018. 6. 14.. 6 | // Copyright © 2018년 유금상. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | import RxValidator 12 | 13 | class ViewController: UIViewController { 14 | 15 | override func viewDidLoad() { 16 | super.viewDidLoad() 17 | // Do any additional setup after loading the view, typically from a nib. 18 | } 19 | 20 | override func didReceiveMemoryWarning() { 21 | super.didReceiveMemoryWarning() 22 | // Dispose of any resources that can be recreated. 23 | } 24 | 25 | 26 | } 27 | 28 | -------------------------------------------------------------------------------- /Tests Host/Supporting Files/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | LSRequiresIPhoneOS 22 | 23 | UILaunchStoryboardName 24 | LaunchScreen 25 | UIMainStoryboardFile 26 | Main 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UISupportedInterfaceOrientations~ipad 38 | 39 | UIInterfaceOrientationPortrait 40 | UIInterfaceOrientationPortraitUpsideDown 41 | UIInterfaceOrientationLandscapeLeft 42 | UIInterfaceOrientationLandscapeRight 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /Tests/AlwaysFailingTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AlwaysFailingTests.swift 3 | // RxValidatorExampleTests 4 | // 5 | // Created by 유금상 on 2018. 6. 28.. 6 | // Copyright © 2018년 유금상. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | 11 | class AlwaysFailingTests: XCTestCase { 12 | 13 | func testExample() { 14 | // XCTFail() 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /Tests/DateValidateTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DateValidateTests.swift 3 | // RxValidatorExampleTests 4 | // 5 | // Created by 유금상 on 2018. 6. 18.. 6 | // Copyright © 2018년 유금상. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | import RxSwift 11 | import Nimble 12 | import SwiftDate 13 | 14 | import RxValidator 15 | 16 | class DateValidateTests: XCTestCase { 17 | 18 | var disposeBag = DisposeBag() 19 | 20 | 21 | func testDateValidation() { 22 | 23 | let targetDate = "2018-05-29T12:00+09:00".toISODate()!.date 24 | let afterTargetDate = "2018-05-29T12:01+09:00".toISODate()!.date 25 | let beforeTargetDate = "2018-05-29T11:59+09:00".toISODate()!.date 26 | let sameTargetDate = "2018-05-29T12:00+09:00".toISODate()!.date 27 | 28 | var resultDate: Date? 29 | var resultError: RxValidatorResult = .valid 30 | let underTest = DateValidationTarget(targetDate) 31 | 32 | 33 | underTest 34 | .validate(.shouldEqualTo(sameTargetDate)) 35 | .validate(.shouldAfterOrSameThen(sameTargetDate)) 36 | .validate(.shouldBeforeOrSameThen(sameTargetDate)) 37 | .validate(.shouldBeforeOrSameThen(afterTargetDate)) 38 | .validate(.shouldBeforeThen(afterTargetDate)) 39 | .validate(.shouldAfterOrSameThen(beforeTargetDate)) 40 | .validate(.shouldAfterThen(beforeTargetDate)) 41 | .asObservable() 42 | .subscribe(onNext: { (date) in 43 | resultDate = date 44 | }, onError: { (error) in 45 | resultError = RxValidatorResult.determine(error: error) 46 | }).disposed(by: disposeBag) 47 | 48 | expect(resultError).toEventually(equal(.valid)) 49 | expect(resultDate).toEventuallyNot(beNil()) 50 | expect(resultDate).toEventually(equal(targetDate)) 51 | } 52 | 53 | func testDateValidationShouldBeforeThenWithSameTargetDate() { 54 | // given 55 | let targetDate = "2018-05-29T12:00+09:00".toISODate()!.date 56 | let sameTargetDate = "2018-05-29T12:00+09:00".toISODate()!.date 57 | var resultDate: Date? 58 | var resultError: RxValidatorResult = .valid 59 | let underTest = DateValidationTarget(targetDate) 60 | 61 | // when 62 | underTest 63 | .validate(.shouldBeforeThen(sameTargetDate)) 64 | .asObservable() 65 | .subscribe(onNext: { (date) in 66 | resultDate = date 67 | }, onError: { (error) in 68 | resultError = RxValidatorResult.determine(error: error) 69 | }).disposed(by: disposeBag) 70 | 71 | // then 72 | // it should not before date 73 | expect(resultError).toEventually(equal(RxValidatorResult.notBeforeDate)) 74 | expect(resultDate).toEventually(beNil()) 75 | } 76 | 77 | func testDateValidationShouldAfterThenWithSameTargetDate() { 78 | // given 79 | let targetDate = "2018-05-29T12:00+09:00".toISODate()!.date 80 | let sameTargetDate = "2018-05-29T12:00+09:00".toISODate()!.date 81 | var resultDate: Date? 82 | var resultError: RxValidatorResult = .valid 83 | let underTest = DateValidationTarget(targetDate) 84 | 85 | // when 86 | underTest 87 | .validate(.shouldAfterThen(sameTargetDate)) 88 | .asObservable() 89 | .subscribe(onNext: { (date) in 90 | resultDate = date 91 | }, onError: { (error) in 92 | resultError = RxValidatorResult.determine(error: error) 93 | }).disposed(by: disposeBag) 94 | 95 | // then 96 | // it should not after date 97 | expect(resultError).toEventually(equal(RxValidatorResult.notAfterDate)) 98 | expect(resultDate).toEventually(beNil()) 99 | } 100 | 101 | func testDateValidationWithAllday() { 102 | let targetDate = "2018-05-29T12:00:00+09:00".toISODate()!.date 103 | 104 | let afterTargetDateInSameDay = "2018-05-29T12:00:01+09:00".toISODate()!.date 105 | let beforeTargetDateInSameDay = "2018-05-29T11:59:59+09:00".toISODate()!.date 106 | 107 | let afterTargetDate = "2018-05-30T12:00:01+09:00".toISODate()!.date 108 | let beforeTargetDate = "2018-05-28T11:59:59+09:00".toISODate()!.date 109 | 110 | let sameTargetDate = "2018-05-29T12:00:00+09:00".toISODate()!.date 111 | 112 | 113 | 114 | var resultDate: Date? 115 | 116 | let underTest = DateValidationTarget(targetDate, granularity: Calendar.Component.day) 117 | 118 | underTest 119 | .validate(.shouldEqualTo(sameTargetDate)) 120 | .validate(.shouldEqualTo(afterTargetDateInSameDay)) 121 | .validate(.shouldEqualTo(beforeTargetDateInSameDay)) 122 | 123 | .validate(.shouldBeforeThen(afterTargetDate)) 124 | .validate(.shouldBeforeOrSameThen(sameTargetDate)) 125 | .validate(.shouldBeforeOrSameThen(afterTargetDateInSameDay)) 126 | .validate(.shouldBeforeOrSameThen(beforeTargetDateInSameDay)) 127 | 128 | .validate(.shouldAfterThen(beforeTargetDate)) 129 | .validate(.shouldAfterOrSameThen(sameTargetDate)) 130 | .validate(.shouldAfterOrSameThen(afterTargetDateInSameDay)) 131 | .validate(.shouldAfterOrSameThen(beforeTargetDateInSameDay)) 132 | 133 | .asObservable() 134 | .subscribe(onNext: { (date) in 135 | resultDate = date 136 | }).disposed(by: disposeBag) 137 | 138 | expect(resultDate).toEventuallyNot(beNil()) 139 | expect(resultDate).toEventually(equal(targetDate)) 140 | } 141 | 142 | func testDateTermValidationSuccess() { 143 | let targetDate = "2018-05-29T12:00+09:00".toISODate()!.date 144 | let validEndDate = "2018-06-28T12:00+09:00".toISODate()!.date 145 | 146 | var resultDate: Date? 147 | var raisedError: Bool = false 148 | 149 | let underTest = DateValidationTarget(targetDate) 150 | underTest 151 | .validate(.shouldBeCloseDates(validEndDate, termOfDays: 30)) 152 | .asObservable().subscribe(onNext: { (date) in 153 | resultDate = date 154 | }, onError: { (error) in 155 | raisedError = true 156 | }).disposed(by: disposeBag) 157 | 158 | expect(resultDate).toEventually(equal(targetDate)) 159 | expect(raisedError).toEventually(beFalse()) 160 | 161 | } 162 | 163 | func testDateTermValidationFailure() { 164 | let targetDate = "2018-05-29T12:00+09:00".toISODate()!.date 165 | let notValidEndDate = "2018-06-29T12:00+09:00".toISODate()!.date 166 | 167 | var resultDate: Date? 168 | var raisedError: Bool = false 169 | 170 | 171 | let underTest = DateValidationTarget(targetDate) 172 | underTest 173 | .validate(.shouldBeCloseDates(notValidEndDate, termOfDays: 30)) 174 | .asObservable().subscribe(onNext: { (date) in 175 | resultDate = date 176 | }, onError: { (error) in 177 | if RxValidatorResult.determine(error: error) == RxValidatorResult.invalidateDateTerm { 178 | raisedError = true 179 | } 180 | 181 | }).disposed(by: disposeBag) 182 | expect(resultDate).toEventually(beNil()) 183 | expect(raisedError).toEventually(beTrue()) 184 | 185 | } 186 | 187 | } 188 | 189 | -------------------------------------------------------------------------------- /Tests/InstantValidateTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // InstantValidateTests.swift 3 | // RxValidatorExampleTests 4 | // 5 | // Created by 유금상 on 2018. 6. 22.. 6 | // Copyright © 2018년 유금상. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | import Nimble 11 | import RxSwift 12 | 13 | import RxValidator 14 | 15 | class InstantValidateTests: XCTestCase { 16 | 17 | let disposeBag = DisposeBag() 18 | 19 | func testStringInstantValidateWithoutMessage() { 20 | let stringResult: RxValidatorResult = Validate.to("swift") 21 | .validate({ $0 == "objc" }) 22 | .check() 23 | 24 | expect(stringResult).to(equal(RxValidatorResult.notValid)) 25 | } 26 | 27 | func testIntInstantValidateWithoutMessage() { 28 | let intResult: RxValidatorResult = Validate.to(7) 29 | .validate({ $0 > 10 }) 30 | .check() 31 | 32 | expect(intResult).to(equal(RxValidatorResult.notValid)) 33 | } 34 | 35 | func testDateInstantValidateWithoutMessage() { 36 | let dateResult: RxValidatorResult = Validate.to(Date()) 37 | .validate({ !$0.isToday }) 38 | .check() 39 | 40 | expect(dateResult).to(equal(RxValidatorResult.notValid)) 41 | } 42 | 43 | func testStringInstantValidateWithMessage() { 44 | let stringMessage = "This is not swift" 45 | let stringResult: RxValidatorResult = Validate.to("objc") 46 | .validate({ $0 == "swift" }, message: stringMessage) 47 | .check() 48 | 49 | expect(stringResult).to(equal(RxValidatorResult.notValidWithMessage(message: stringMessage))) 50 | } 51 | 52 | func testIntInstantValidateWithMessage() { 53 | let intMessage = "Number is too small." 54 | let intResult: RxValidatorResult = Validate.to(7) 55 | .validate({ $0 > 10 }, message: intMessage) 56 | .check() 57 | expect(intResult).to(equal(RxValidatorResult.notValidWithMessage(message: intMessage))) 58 | } 59 | 60 | func testDateInstantValidateWithMessage() { 61 | let dateMessage = "It is today!!" 62 | let dateResult: RxValidatorResult = Validate.to(Date()) 63 | .validate({ !$0.isToday }, message: dateMessage) 64 | .check() 65 | 66 | expect(dateResult).to(equal(RxValidatorResult.notValidWithMessage(message: dateMessage))) 67 | } 68 | 69 | func testDateInstantValidateWithMessageAndGranularity() { 70 | let dateMessage = "It is today!!" 71 | let dateResult: RxValidatorResult = Validate.to(Date(), granularity: .day) 72 | .validate({ !$0.isToday }, message: dateMessage) 73 | .check() 74 | 75 | expect(dateResult).to(equal(RxValidatorResult.notValidWithMessage(message: dateMessage))) 76 | } 77 | 78 | func testStringInstantValidateWithObservable() { 79 | 80 | let stringSubject = PublishSubject() 81 | var result: RxValidatorResult? 82 | 83 | stringSubject 84 | .validate({ $0 == "swift" }) 85 | .subscribe(onNext: { (text) in 86 | XCTFail() 87 | }, onError: { (error) in 88 | result = RxValidatorResult.determine(error: error) 89 | }) 90 | .disposed(by: disposeBag) 91 | 92 | stringSubject.onNext("objc") 93 | 94 | expect(result).to(equal(RxValidatorResult.notValid)) 95 | } 96 | 97 | func testIntInstantValidateWithObservable() { 98 | let subject = PublishSubject() 99 | var result: RxValidatorResult? 100 | 101 | subject 102 | .validate({ $0 > 10 }) 103 | .subscribe(onNext: { (text) in 104 | XCTFail() 105 | }, onError: { (error) in 106 | result = RxValidatorResult.determine(error: error) 107 | }) 108 | .disposed(by: disposeBag) 109 | 110 | subject.onNext(7) 111 | 112 | expect(result).to(equal(RxValidatorResult.notValid)) 113 | } 114 | 115 | func testDateInstantValidateWithObservable() { 116 | 117 | let subject = PublishSubject() 118 | var result: RxValidatorResult? 119 | 120 | subject 121 | .validate({ !$0.isToday }) 122 | .subscribe(onNext: { (text) in 123 | XCTFail() 124 | }, onError: { (error) in 125 | result = RxValidatorResult.determine(error: error) 126 | }) 127 | .disposed(by: disposeBag) 128 | 129 | subject.onNext(Date()) 130 | 131 | expect(result).to(equal(RxValidatorResult.notValid)) 132 | } 133 | } 134 | -------------------------------------------------------------------------------- /Tests/NumberValidateTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NumberValidateTests.swift 3 | // RxValidatorExampleTests 4 | // 5 | // Created by 유금상 on 2018. 6. 20.. 6 | // Copyright © 2018년 유금상. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | import RxSwift 11 | import Nimble 12 | 13 | import RxValidator 14 | 15 | class NumberValidateTests: XCTestCase { 16 | 17 | func testEvenNumber() { 18 | 19 | let resultNotValid = Validate.to(1) 20 | .validate(.shouldBeEven) 21 | .check() 22 | expect(resultNotValid).to(equal(RxValidatorResult.notEvenNumber)) 23 | 24 | let resultValid = Validate.to(2) 25 | .validate(.shouldBeEven) 26 | .check() 27 | expect(resultValid).to(equal(RxValidatorResult.valid)) 28 | } 29 | 30 | func testEqualNumber() { 31 | let resultNotValid = Validate.to(1) 32 | .validate(.shouldEqualTo(2)) 33 | .check() 34 | 35 | let resultValid = Validate.to(1) 36 | .validate(.shouldEqualTo(1)) 37 | .check() 38 | 39 | expect(resultNotValid).to(equal(RxValidatorResult.notEqualNumber)) 40 | expect(resultValid).to(equal(RxValidatorResult.valid)) 41 | } 42 | 43 | func testLessThanNumber() { 44 | let resultNotValid = Validate.to(2) 45 | .validate(.shouldLessThan(1)) 46 | .check() 47 | 48 | let resultValid = Validate.to(1) 49 | .validate(.shouldLessThan(2)) 50 | .check() 51 | 52 | expect(resultNotValid).to(equal(RxValidatorResult.notLessThenNumber)) 53 | expect(resultValid).to(equal(RxValidatorResult.valid)) 54 | } 55 | 56 | func testGreaterThanNumber() { 57 | let resultNotValid = Validate.to(1) 58 | .validate(.shouldGreaterThan(2)) 59 | .check() 60 | 61 | let resultValid = Validate.to(2) 62 | .validate(.shouldGreaterThan(1)) 63 | .check() 64 | 65 | expect(resultNotValid).to(equal(RxValidatorResult.notGreaterThanNumber)) 66 | expect(resultValid).to(equal(RxValidatorResult.valid)) 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /Tests/ObservableExtensionTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ObservableExtensionTests.swift 3 | // RxValidatorExampleTests 4 | // 5 | // Created by 유금상 on 2018. 6. 20.. 6 | // Copyright © 2018년 유금상. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | import Nimble 11 | import RxSwift 12 | import RxCocoa 13 | 14 | import RxValidator 15 | 16 | class ObservableExtensionTests: XCTestCase { 17 | 18 | var disposeBag = DisposeBag() 19 | 20 | func testObservableStringSuccess() { 21 | var result:String? 22 | 23 | let observable = PublishSubject() 24 | 25 | observable 26 | .asObservable() 27 | .validate(.isAlwaysPass) 28 | .asObservable() 29 | .subscribe(onNext: { text in 30 | result = text 31 | }) 32 | .disposed(by: disposeBag) 33 | 34 | let expectedString = "something string" 35 | observable.onNext(expectedString) 36 | expect(result).toEventually(equal(expectedString)) 37 | } 38 | 39 | func testObservableStringFailure() { 40 | var result:RxValidatorResult = .valid 41 | 42 | let observable = PublishSubject() 43 | 44 | observable 45 | .asObservable() 46 | .validate(.shouldNotBeEmpty) 47 | .asObservable() 48 | .subscribe(onNext: { (text) in 49 | XCTFail() 50 | }, onError: { (error) in 51 | result = RxValidatorResult.determine(error: error) 52 | }) 53 | .disposed(by: disposeBag) 54 | 55 | let expectedString = "" 56 | observable.onNext(expectedString) 57 | expect(result).toEventually(equal(RxValidatorResult.stringIsEmpty)) 58 | } 59 | 60 | func testObservableStringFailureWithMessage() { 61 | let errorMessage = "Error Message" 62 | 63 | var result:RxValidatorResult = .valid 64 | 65 | let observable = PublishSubject() 66 | 67 | observable 68 | .asObservable() 69 | .validate(.shouldNotBeEmpty, message: errorMessage) 70 | .asObservable() 71 | .subscribe(onNext: { (text) in 72 | XCTFail() 73 | }, onError: { (error) in 74 | result = RxValidatorResult.determine(error: error) 75 | }) 76 | .disposed(by: disposeBag) 77 | 78 | let expectedString = "" 79 | observable.onNext(expectedString) 80 | expect(result).toEventually(equal(RxValidatorResult.notValidWithMessage(message: errorMessage))) 81 | } 82 | 83 | func testObservableIntSuccess() { 84 | var result:Int? 85 | 86 | let observable = PublishSubject() 87 | 88 | observable 89 | .asObservable() 90 | .validate(.shouldBeEven) 91 | .asObservable() 92 | .subscribe(onNext: { number in 93 | result = number 94 | }) 95 | .disposed(by: disposeBag) 96 | 97 | let expectedString = 2 98 | observable.onNext(expectedString) 99 | expect(result).toEventually(equal(expectedString)) 100 | } 101 | 102 | func testObservableIntFailure() { 103 | var result: RxValidatorResult = .valid 104 | let observable = PublishSubject() 105 | 106 | observable 107 | .asObservable() 108 | .validate(.shouldBeEven) 109 | .asObservable() 110 | .subscribe(onNext: { (text) in 111 | XCTFail() 112 | }, onError: { (error) in 113 | result = RxValidatorResult.determine(error: error) 114 | }) 115 | .disposed(by: disposeBag) 116 | 117 | let expectedString = 1 118 | observable.onNext(expectedString) 119 | expect(result).toEventually(equal(RxValidatorResult.notEvenNumber)) 120 | } 121 | func testObservableIntFailureWithMessage() { 122 | let errorMessage = "Error Message" 123 | 124 | var result: RxValidatorResult = .valid 125 | let observable = PublishSubject() 126 | 127 | observable 128 | .asObservable() 129 | .validate(.shouldBeEven, message: errorMessage) 130 | .asObservable() 131 | .subscribe(onNext: { (text) in 132 | XCTFail() 133 | }, onError: { (error) in 134 | result = RxValidatorResult.determine(error: error) 135 | }) 136 | .disposed(by: disposeBag) 137 | 138 | let expectedString = 1 139 | observable.onNext(expectedString) 140 | expect(result).toEventually(equal(RxValidatorResult.notValidWithMessage(message: errorMessage))) 141 | } 142 | 143 | func testObservableDateSuccess() { 144 | var result:Date? 145 | let date = Date() 146 | 147 | let observable = PublishSubject() 148 | 149 | observable 150 | .asObservable() 151 | .validate(.shouldEqualTo(date)) 152 | .asObservable() 153 | .subscribe(onNext: { number in 154 | result = number 155 | }) 156 | .disposed(by: disposeBag) 157 | 158 | observable.onNext(date) 159 | expect(result).toEventually(equal(date)) 160 | } 161 | func testObservableDateFailure() { 162 | var result: RxValidatorResult = .valid 163 | let date = Date() 164 | let newDate = Date(timeIntervalSince1970: 1000) 165 | 166 | let observable = PublishSubject() 167 | 168 | observable 169 | .asObservable() 170 | .validate(.shouldEqualTo(newDate)) 171 | .asObservable() 172 | .subscribe(onNext: { (text) in 173 | XCTFail() 174 | }, onError: { (error) in 175 | result = RxValidatorResult.determine(error: error) 176 | }) 177 | .disposed(by: disposeBag) 178 | 179 | observable.onNext(date) 180 | expect(result).toEventually(equal(RxValidatorResult.notEqualDate)) 181 | } 182 | func testObservableDateFailureWithMessage() { 183 | let errorMessage = "Error Message" 184 | 185 | var result: RxValidatorResult = .valid 186 | let date = Date() 187 | let newDate = Date(timeIntervalSince1970: 1000) 188 | 189 | let observable = PublishSubject() 190 | 191 | observable 192 | .asObservable() 193 | .validate(.shouldEqualTo(newDate), message: errorMessage) 194 | .asObservable() 195 | .subscribe(onNext: { (text) in 196 | XCTFail() 197 | }, onError: { (error) in 198 | result = RxValidatorResult.determine(error: error) 199 | }) 200 | .disposed(by: disposeBag) 201 | 202 | observable.onNext(date) 203 | expect(result).toEventually(equal(RxValidatorResult.notValidWithMessage(message: errorMessage))) 204 | } 205 | } 206 | -------------------------------------------------------------------------------- /Tests/RxValidatorResultTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RxValidatorResultTests.swift 3 | // RxValidatorExampleTests 4 | // 5 | // Created by 유금상 on 2018. 6. 19.. 6 | // Copyright © 2018년 유금상. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | import Nimble 11 | 12 | import RxValidator 13 | 14 | class RxValidatorResultTests: XCTestCase { 15 | 16 | func testValid() { 17 | let error: Error = RxValidatorResult.valid 18 | let result = RxValidatorResult.determine(error: error) 19 | expect(result).to(equal(.valid)) 20 | } 21 | 22 | func testUndefinedError() { 23 | let error: Error = NSError(domain: "not defined", code: -999, userInfo: nil) 24 | let result = RxValidatorResult.determine(error: error) 25 | expect(result).to(equal(.undefinedError)) 26 | } 27 | 28 | func testCustomNotValid() { 29 | let expectedResult = RxValidatorResult.notValidWithCode(code: 777) 30 | 31 | let error: Error = expectedResult 32 | let otherError: Error = RxValidatorResult.notValidWithCode(code: 666) 33 | 34 | let result = RxValidatorResult.determine(error: error) 35 | expect(result).to(equal(expectedResult)) 36 | expect(result.getCode()).to(equal(777)) 37 | 38 | expect(RxValidatorResult.determine(error: otherError)).toNot(equal(expectedResult)) 39 | 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Tests/StringValidateRegexTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StringValidateRegexTests.swift 3 | // RxValidatorExampleTests 4 | // 5 | // Created by 유금상 on 2018. 6. 18.. 6 | // Copyright © 2018년 유금상. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | import RxSwift 11 | import Nimble 12 | 13 | import RxValidator 14 | 15 | class StringValidateRegexTests: XCTestCase { 16 | 17 | var disposeBag = DisposeBag() 18 | 19 | func testTarget() { 20 | let targetValue = "vbmania@me.com" 21 | var resultValue: String? 22 | 23 | Validate.to(targetValue) 24 | .validate(.shouldBeMatch("[a-z]+@[a-z]+\\.[a-z]+")) 25 | .asObservable() 26 | .subscribe(onNext: { value in 27 | resultValue = value 28 | }).disposed(by: disposeBag) 29 | 30 | expect(resultValue).toEventuallyNot(beNil()) 31 | expect(resultValue).toEventually(equal(targetValue)) 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Tests/StringValidateTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StringValidateTests.swift 3 | // RxValidatorExampleTests 4 | // 5 | // Created by 유금상 on 2018. 6. 18.. 6 | // Copyright © 2018년 유금상. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | import RxSwift 11 | import Nimble 12 | 13 | import RxValidator 14 | 15 | class StringValidateTests: XCTestCase { 16 | 17 | var disposeBag = DisposeBag() 18 | let errorValue = "에러남" 19 | 20 | func testEmptyStringValidationSuccess() { 21 | 22 | let targetValue = "a" 23 | var resultValue: String? 24 | 25 | Validate.to(targetValue) 26 | .validate(.shouldNotBeEmpty) 27 | .asObservable().subscribe(onNext: { value in 28 | resultValue = value 29 | }).disposed(by: disposeBag) 30 | 31 | expect(resultValue).toEventuallyNot(beNil()) 32 | expect(resultValue).toEventually(equal(targetValue)) 33 | } 34 | 35 | func testEmptyStringValidationFail() { 36 | 37 | let targetValue = "" 38 | var resultValue: String? 39 | let expectErrorMsg = "EMPTY" 40 | 41 | Validate.to(targetValue) 42 | .validate(.shouldNotBeEmpty) 43 | .asObservable().catchError({ (error) -> Observable in 44 | if let validationError = error as? RxValidatorResult, validationError == RxValidatorResult.stringIsEmpty { 45 | return Observable.just(expectErrorMsg) 46 | } 47 | return Observable.just("notExpectString") 48 | }) 49 | .subscribe(onNext: { value in 50 | resultValue = value 51 | }).disposed(by: disposeBag) 52 | 53 | expect(resultValue).toEventually(equal(expectErrorMsg)) 54 | expect(resultValue).toEventuallyNot(equal(targetValue)) 55 | } 56 | 57 | 58 | func testEmptyStringValidationFailWithOnlySpaceString() { 59 | 60 | let targetValue = " " 61 | var resultValue: String? 62 | let expectErrorMsg = "EMPTY" 63 | 64 | Validate.to(targetValue) 65 | .validate(.shouldNotBeEmpty) 66 | .asObservable().catchError({ (error) -> Observable in 67 | if let validationError = error as? RxValidatorResult, validationError == RxValidatorResult.stringIsEmpty { 68 | return Observable.just(expectErrorMsg) 69 | } 70 | return Observable.just("notExpectString") 71 | }) 72 | .subscribe(onNext: { value in 73 | resultValue = value 74 | }).disposed(by: disposeBag) 75 | 76 | expect(resultValue).toEventually(equal(expectErrorMsg)) 77 | expect(resultValue).toEventuallyNot(equal(targetValue)) 78 | } 79 | 80 | func testEqualStringValidationFailure() { 81 | let targetValue = "1234" 82 | var result = false 83 | 84 | Validate.to(targetValue) 85 | .validate(.shouldEqualTo("4321")) 86 | .asObservable() 87 | .map { _ in false } 88 | .catchError { error -> Observable in 89 | if let error = error as? RxValidatorResult, error == RxValidatorResult.notEqualString { 90 | return .just(true) 91 | } 92 | return .just(false) 93 | } 94 | .subscribe(onNext: { value in 95 | result = value 96 | }) 97 | .disposed(by: disposeBag) 98 | 99 | expect(result).toEventually(equal(true)) 100 | } 101 | 102 | func testUnderflowStringValidationFailure() { 103 | let targetValue = "1234" 104 | var result = false 105 | 106 | Validate.to(targetValue) 107 | .validate(.isNotUnderflowThen(min: 8)) 108 | .asObservable() 109 | .map { _ in false } 110 | .catchError { error -> Observable in 111 | if let error = error as? RxValidatorResult, error == RxValidatorResult.stringIsUnderflow { 112 | return .just(true) 113 | } 114 | return .just(false) 115 | } 116 | .subscribe(onNext: { value in 117 | result = value 118 | }) 119 | .disposed(by: disposeBag) 120 | 121 | expect(result).toEventually(equal(true)) 122 | } 123 | 124 | func testMultipleStringValidation_Success() { 125 | 126 | let targetValue = "a" 127 | var resultValue: String? 128 | 129 | Validate.to(targetValue) 130 | .validate(.shouldNotBeEmpty) 131 | .validate(.isNotOverflowThen(max: 2)) 132 | .asObservable() 133 | .catchErrorJustReturn(errorValue) 134 | .subscribe(onNext: { value in 135 | resultValue = value 136 | }).disposed(by: disposeBag) 137 | 138 | expect(resultValue).toEventuallyNot(beNil()) 139 | expect(resultValue).toEventually(equal(targetValue)) 140 | } 141 | 142 | func testMultipleStringValidation_FailureOverflow() { 143 | let targetValue = "123" 144 | var resultValue: String? 145 | 146 | Validate.to(targetValue) 147 | .validate(.shouldNotBeEmpty) 148 | .validate(.isNotOverflowThen(max: 2)) 149 | .asObservable() 150 | .catchErrorJustReturn(errorValue) 151 | .subscribe(onNext: { value in 152 | resultValue = value 153 | }).disposed(by: disposeBag) 154 | 155 | expect(resultValue).toEventuallyNot(beNil()) 156 | expect(resultValue).toEventually(equal(errorValue)) 157 | } 158 | 159 | 160 | func testStringArray() { 161 | let targetValue = ["1", "2", "3"] 162 | 163 | let result: RxValidatorResult = targetValue 164 | .compactMap { return Validate.to($0).validate(.shouldNotBeEmpty).check() } 165 | .reduce(RxValidatorResult.valid) { $0 != .valid ? $0 : $1 } 166 | 167 | expect(result).toEventually(equal(.valid)) 168 | } 169 | } 170 | -------------------------------------------------------------------------------- /Tests/ValidationWithRxSwiftTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ValidationWithRxSwiftTests.swift 3 | // RxValidatorExampleTests 4 | // 5 | // Created by 유금상 on 2018. 6. 20.. 6 | // Copyright © 2018년 유금상. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | import RxSwift 11 | import RxCocoa 12 | import RxOptional 13 | import RxValidator 14 | import Nimble 15 | import UIKit 16 | 17 | class ValidationWithRxSwiftTests: XCTestCase { 18 | 19 | var disposeBag = DisposeBag() 20 | 21 | func testRxTextField() { 22 | //Given 23 | let textField = UITextField(frame: .zero) 24 | textField.delegate = TextFieldDelegate() 25 | 26 | //When 27 | var result: String? 28 | 29 | textField.rx.text 30 | .filterNil() 31 | .validate(.isAlwaysPass) 32 | .subscribe(onNext: { (text) in 33 | print(text) 34 | result = text 35 | }) 36 | .disposed(by: disposeBag) 37 | 38 | textField.text = "가나다라마바사" 39 | textField.sendActions(for: .valueChanged) 40 | 41 | //Then 42 | expect(result).toEventually(equal("가나다라마바사")) 43 | } 44 | 45 | func testTextField() { 46 | //Given 47 | let textField = UITextField(frame: .zero) 48 | let delegate = TextFieldDelegate() 49 | textField.delegate = delegate 50 | 51 | //When 52 | textField.text = "abcde" 53 | textField.sendActions(for: .valueChanged) 54 | 55 | //Then 56 | expect(textField.text).to(equal("abcde")) 57 | 58 | //When 59 | let notValidString = "가나다라마바사" 60 | if textField.delegate!.textField!(textField, shouldChangeCharactersIn: NSRange(location: textField.text!.count, length: 0), replacementString: notValidString) { 61 | textField.text = notValidString 62 | } 63 | textField.sendActions(for: .valueChanged) 64 | 65 | //Then 66 | expect(textField.text).to(equal("abcde")) 67 | } 68 | 69 | func testPublishSubject() { 70 | //Given 71 | var result: String? 72 | 73 | let text = PublishSubject() 74 | text 75 | .validate(.isAlwaysPass) 76 | .subscribe(onNext: { (text) in 77 | print(text) 78 | result = text 79 | }) 80 | .disposed(by: disposeBag) 81 | 82 | //When 83 | text.onNext("가나다라마바사") 84 | 85 | //Then 86 | expect(result).toEventually(equal("가나다라마바사")) 87 | } 88 | 89 | } 90 | 91 | 92 | class TextFieldDelegate: NSObject, UITextFieldDelegate { 93 | func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 94 | return Validate.to(string) 95 | .validate(.shouldBeMatch("[a-z1-9]")) 96 | .check() == .valid 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /codecov.yml: -------------------------------------------------------------------------------- 1 | codecov: 2 | branch: develop 3 | --------------------------------------------------------------------------------