Skip to content

Commit

Permalink
Support Xcode 11
Browse files Browse the repository at this point in the history
  • Loading branch information
Tuan Truong committed Oct 8, 2019
1 parent dddf19b commit 73d558b
Show file tree
Hide file tree
Showing 14 changed files with 49 additions and 34 deletions.
4 changes: 4 additions & 0 deletions CleanArchitecture.xcodeproj/project.pbxproj
Expand Up @@ -1558,6 +1558,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 6;
HEADER_SEARCH_PATHS = (
"$(inherited)",
"\"${PODS_ROOT}/Headers/Public\"",
Expand All @@ -1571,6 +1572,7 @@
INFOPLIST_FILE = CleanArchitecture/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MARKETING_VERSION = 3.0;
PRODUCT_BUNDLE_IDENTIFIER = com.framgia.CleanArchitecture;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "CleanArchitecture/Bridging-Header.h";
Expand All @@ -1586,6 +1588,7 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 6;
HEADER_SEARCH_PATHS = (
"$(inherited)",
"\"${PODS_ROOT}/Headers/Public\"",
Expand All @@ -1599,6 +1602,7 @@
INFOPLIST_FILE = CleanArchitecture/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 10.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
MARKETING_VERSION = 3.0;
PRODUCT_BUNDLE_IDENTIFIER = com.framgia.CleanArchitecture;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_OBJC_BRIDGING_HEADER = "CleanArchitecture/Bridging-Header.h";
Expand Down
4 changes: 2 additions & 2 deletions CleanArchitecture/Info.plist
Expand Up @@ -17,9 +17,9 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>2.3</string>
<string>$(MARKETING_VERSION)</string>
<key>CFBundleVersion</key>
<string>5</string>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchStoryboardName</key>
Expand Down
Expand Up @@ -8,20 +8,26 @@

import UIKit

enum ValidationError: Error {
enum ProductValidationError: ValidationError {
case productNameMinLength
case productPriceMinValue
case usernameMinLength
case passwordMinLength
}

extension ValidationError: LocalizedError {
var errorDescription: String? {

var message: String {
switch self {
case .productNameMinLength:
return "Product name must be at least 5 characters."
case .productPriceMinValue:
return "Product price must be greater than 0."
}
}
}

enum LoginValidationError: ValidationError {
case usernameMinLength
case passwordMinLength

var message: String {
switch self {
case .usernameMinLength:
return "Please enter your username."
case .passwordMinLength:
Expand Down
Expand Up @@ -17,14 +17,14 @@ struct DynamicEditProductUseCase: DynamicEditProductUseCaseType {
let productRepository: ProductRepositoryType

func validate(name: String) -> ValidationResult {
let minLengthRule = ValidationRuleLength(min: 5, error: ValidationError.productNameMinLength)
let minLengthRule = ValidationRuleLength(min: 5, error: ProductValidationError.productNameMinLength)
return name.validate(rule: minLengthRule)
}

func validate(price: String) -> ValidationResult {
let priceNumber = Double(price) ?? 0.0
if priceNumber <= 0 {
return ValidationResult.invalid([ValidationError.productPriceMinValue])
return ValidationResult.invalid([ProductValidationError.productPriceMinValue])
}
return ValidationResult.valid
}
Expand Down
Expand Up @@ -84,9 +84,7 @@ extension DynamicEditProductViewModel: ViewModelType {
priceValidation
])
.map {
$0.reduce(true) { result, validation -> Bool in
result && validation.isValid
}
$0.allSatisfy { $0.isValid }
}
.startWith(true)

Expand Down
Expand Up @@ -25,7 +25,7 @@ struct ValidationResultViewModel {
case .valid:
return " "
case .invalid(let errors):
return errors.map { $0.localizedDescription }.joined(separator: "\n")
return errors.map { $0.message }.joined(separator: "\n")
}
}
}
4 changes: 2 additions & 2 deletions CleanArchitecture/Scenes/EditProduct/EditProductUseCase.swift
Expand Up @@ -16,14 +16,14 @@ struct EditProductUseCase: EditProductUseCaseType {
let productRepository: ProductRepositoryType

func validate(name: String) -> ValidationResult {
let minLengthRule = ValidationRuleLength(min: 5, error: ValidationError.productNameMinLength)
let minLengthRule = ValidationRuleLength(min: 5, error: ProductValidationError.productNameMinLength)
return name.validate(rule: minLengthRule)
}

func validate(price: String) -> ValidationResult {
let priceNumber = Double(price) ?? 0.0
if priceNumber <= 0 {
return ValidationResult.invalid([ValidationError.productPriceMinValue])
return ValidationResult.invalid([ProductValidationError.productPriceMinValue])
}
return ValidationResult.valid
}
Expand Down
4 changes: 2 additions & 2 deletions CleanArchitecture/Scenes/Login/LoginUseCase.swift
Expand Up @@ -14,12 +14,12 @@ protocol LoginUseCaseType {

struct LoginUseCase: LoginUseCaseType {
func validate(username: String) -> ValidationResult {
let minLengthRule = ValidationRuleLength(min: 1, error: ValidationError.usernameMinLength)
let minLengthRule = ValidationRuleLength(min: 1, error: LoginValidationError.usernameMinLength)
return username.validate(rule: minLengthRule)
}

func validate(password: String) -> ValidationResult {
let minLengthRule = ValidationRuleLength(min: 1, error: ValidationError.passwordMinLength)
let minLengthRule = ValidationRuleLength(min: 1, error: LoginValidationError.passwordMinLength)
return password.validate(rule: minLengthRule)
}

Expand Down
Expand Up @@ -152,8 +152,8 @@ final class DynamicEditProductViewModelTests: XCTestCase {

func test_updateTrigger_not_update() {
// arrange
useCase.validateNameReturnValue = ValidationResult.invalid([TestError()])
useCase.validatePriceReturnValue = ValidationResult.invalid([TestError()])
useCase.validateNameReturnValue = ValidationResult.invalid([TestValidationError()])
useCase.validatePriceReturnValue = ValidationResult.invalid([TestValidationError()])

// act
dataTrigger.onNext(DynamicEditProductViewModel.DataType.name("foo"))
Expand Down
Expand Up @@ -93,7 +93,7 @@ final class EditProductViewModelTests: XCTestCase {

func test_nameTriggerInvoked_validateNameFailNotEnableUpdate() {
// arrange
useCase.validateNameReturnValue = ValidationResult.invalid([TestError()])
useCase.validateNameReturnValue = ValidationResult.invalid([TestValidationError()])

// act
nameTrigger.onNext("foo")
Expand All @@ -116,7 +116,7 @@ final class EditProductViewModelTests: XCTestCase {

func test_priceTriggerInvoked_validatePriceFailNotEnableUpdate() {
// arrange
useCase.validatePriceReturnValue = ValidationResult.invalid([TestError()])
useCase.validatePriceReturnValue = ValidationResult.invalid([TestValidationError()])

// act
nameTrigger.onNext("foo")
Expand All @@ -141,7 +141,7 @@ final class EditProductViewModelTests: XCTestCase {

func test_updateTriggerInvoked_notUpdateProduct() {
// arrange
useCase.validateNameReturnValue = ValidationResult.invalid([TestError()])
useCase.validateNameReturnValue = ValidationResult.invalid([TestValidationError()])

// act
nameTrigger.onNext("foo")
Expand Down
6 changes: 3 additions & 3 deletions CleanArchitectureTests/Scenes/Login/LoginViewModelTests.swift
Expand Up @@ -69,7 +69,7 @@ final class LoginViewModelTests: XCTestCase {

func test_loginTrigger_validateUsernameFailed_disableLogin() {
// arrange
useCase.validateUsernameReturnValue = ValidationResult.invalid([TestError()])
useCase.validateUsernameReturnValue = ValidationResult.invalid([TestValidationError()])

// act
usernameTrigger.onNext("")
Expand All @@ -84,7 +84,7 @@ final class LoginViewModelTests: XCTestCase {

func test_loginTrigger_validatePasswordFailed_disableLogin() {
// arrange
useCase.validatePasswordReturnValue = ValidationResult.invalid([TestError()])
useCase.validatePasswordReturnValue = ValidationResult.invalid([TestValidationError()])

// act
usernameTrigger.onNext("")
Expand All @@ -99,7 +99,7 @@ final class LoginViewModelTests: XCTestCase {

func test_loginTrigger_disableLogin_notLogin() {
// arrange
useCase.validatePasswordReturnValue = ValidationResult.invalid([TestError()])
useCase.validatePasswordReturnValue = ValidationResult.invalid([TestValidationError()])

// act
usernameTrigger.onNext("")
Expand Down
7 changes: 7 additions & 0 deletions CleanArchitectureTests/Scenes/TestError.swift
Expand Up @@ -7,7 +7,14 @@
//

import UIKit
import Validator

struct TestError: Error {

}

struct TestValidationError: ValidationError {
var message: String {
return "validation error"
}
}
2 changes: 1 addition & 1 deletion Podfile
Expand Up @@ -15,7 +15,7 @@ def pods
pod 'Reusable', '~> 4.1'
pod 'Then', '~> 2.4'
pod 'MJRefresh', '~> 3.2'
pod 'Validator', '~> 3.1.1'
pod 'Validator', '~> 3.2.1'

# Others
pod 'MagicalRecord', '~> 2.3'
Expand Down
12 changes: 6 additions & 6 deletions Podfile.lock
Expand Up @@ -51,7 +51,7 @@ PODS:
- SDWebImage/Core (= 5.0.6)
- SDWebImage/Core (5.0.6)
- Then (2.4.0)
- Validator (3.1.1)
- Validator (3.2.1)

DEPENDENCIES:
- ActionSheetPicker-3.0 (= 2.3)
Expand All @@ -69,10 +69,10 @@ DEPENDENCIES:
- RxDataSources (~> 4.0)
- SDWebImage (~> 5.0)
- Then (~> 2.4)
- Validator (~> 3.1.1)
- Validator (~> 3.2.1)

SPEC REPOS:
https://github.com/cocoapods/specs.git:
trunk:
- ActionSheetPicker-3.0
- Alamofire
- Differentiator
Expand Down Expand Up @@ -127,8 +127,8 @@ SPEC CHECKSUMS:
RxSwift: 8b0671caa829a763bbce7271095859121cbd895f
SDWebImage: 920f1a2ff1ca8296ad34f6e0510a1ef1d70ac965
Then: 71866660c7af35a7343831f7668e7cd2b62ee0f2
Validator: b34ab17a8fffd0c1ffd8f9002ead4d1e02cd9e6e
Validator: 80a6f567220c962dfd2d9928ae98a8c1d164f6f4

PODFILE CHECKSUM: bc9c3ff050a2694e3efa806089011a36f40148d3
PODFILE CHECKSUM: f336419822fb5d4f9ae2c6d23c253a480c73c531

COCOAPODS: 1.7.5
COCOAPODS: 1.8.3

0 comments on commit 73d558b

Please sign in to comment.