├── Pod ├── Assets │ └── .gitkeep └── Classes │ ├── .gitkeep │ ├── StoreType.swift │ ├── ProgrammerAssertions.swift │ ├── combineReducers.swift │ ├── createStore.swift │ ├── types.swift │ └── StoreConnector.swift ├── _Pods.xcodeproj ├── AUTHOR ├── Example ├── Pods │ ├── Target Support Files │ │ ├── Redux │ │ │ ├── Redux.xcconfig │ │ │ ├── Redux-prefix.pch │ │ │ ├── Redux.modulemap │ │ │ ├── Redux-dummy.m │ │ │ ├── Redux-umbrella.h │ │ │ ├── Redux-Private.xcconfig │ │ │ └── Info.plist │ │ ├── Pods-Redux_Tests │ │ │ ├── Pods-Redux_Tests.modulemap │ │ │ ├── Pods-Redux_Tests-dummy.m │ │ │ ├── Pods-Redux_Tests-umbrella.h │ │ │ ├── Pods-Redux_Tests.debug.xcconfig │ │ │ ├── Pods-Redux_Tests.release.xcconfig │ │ │ ├── Info.plist │ │ │ ├── Pods-Redux_Tests-acknowledgements.markdown │ │ │ ├── Pods-Redux_Tests-acknowledgements.plist │ │ │ ├── Pods-Redux_Tests-frameworks.sh │ │ │ └── Pods-Redux_Tests-resources.sh │ │ └── Pods-Redux_Example │ │ │ ├── Pods-Redux_Example.modulemap │ │ │ ├── Pods-Redux_Example-dummy.m │ │ │ ├── Pods-Redux_Example-umbrella.h │ │ │ ├── Pods-Redux_Example.debug.xcconfig │ │ │ ├── Pods-Redux_Example.release.xcconfig │ │ │ ├── Info.plist │ │ │ ├── Pods-Redux_Example-acknowledgements.markdown │ │ │ ├── Pods-Redux_Example-acknowledgements.plist │ │ │ ├── Pods-Redux_Example-frameworks.sh │ │ │ └── Pods-Redux_Example-resources.sh │ ├── Manifest.lock │ ├── Local Podspecs │ │ └── Redux.podspec.json │ └── Pods.xcodeproj │ │ ├── xcshareddata │ │ └── xcschemes │ │ │ ├── Pods-Redux_Tests.xcscheme │ │ │ └── Redux.xcscheme │ │ └── project.pbxproj ├── Redux.xcodeproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── Redux-Example.xcscheme │ └── project.pbxproj ├── Podfile.lock ├── Podfile ├── Redux.xcworkspace │ └── contents.xcworkspacedata ├── Redux │ ├── Store.swift │ ├── Images.xcassets │ │ └── AppIcon.appiconset │ │ │ └── Contents.json │ ├── AppDelegate.swift │ ├── AppState.swift │ ├── Info.plist │ ├── TodoListItem.swift │ ├── TodoListReducer.swift │ ├── TodoListAction.swift │ ├── ViewController.swift │ └── Base.lproj │ │ ├── LaunchScreen.xib │ │ └── Main.storyboard └── Tests │ ├── Info.plist │ ├── TodoListActionTests.swift │ ├── MockDispatch.swift │ ├── StoreTests.swift │ ├── XCTestCase+ProgrammerAssertions.swift │ ├── Tests.swift │ ├── ReducerTests.swift │ └── StoreConnectorTests.swift ├── .swiftlint.yml ├── .gitignore ├── LICENSE ├── .travis.yml ├── Redux.podspec └── README.md /Pod/Assets/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Pod/Classes/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /_Pods.xcodeproj: -------------------------------------------------------------------------------- 1 | Example/Pods/Pods.xcodeproj -------------------------------------------------------------------------------- /AUTHOR: -------------------------------------------------------------------------------- 1 | Steven-Chan 2 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Redux/Redux.xcconfig: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Redux/Redux-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Redux/Redux.modulemap: -------------------------------------------------------------------------------- 1 | framework module Redux { 2 | umbrella header "Redux-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Redux/Redux-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Redux : NSObject 3 | @end 4 | @implementation PodsDummy_Redux 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Redux/Redux-umbrella.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | FOUNDATION_EXPORT double ReduxVersionNumber; 5 | FOUNDATION_EXPORT const unsigned char ReduxVersionString[]; 6 | 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Redux_Tests/Pods-Redux_Tests.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_Redux_Tests { 2 | umbrella header "Pods-Redux_Tests-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Redux_Example/Pods-Redux_Example.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_Redux_Example { 2 | umbrella header "Pods-Redux_Example-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Redux_Tests/Pods-Redux_Tests-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_Redux_Tests : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_Redux_Tests 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Redux_Example/Pods-Redux_Example-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_Redux_Example : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_Redux_Example 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Redux.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Redux_Tests/Pods-Redux_Tests-umbrella.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | FOUNDATION_EXPORT double Pods_Redux_TestsVersionNumber; 5 | FOUNDATION_EXPORT const unsigned char Pods_Redux_TestsVersionString[]; 6 | 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Redux_Example/Pods-Redux_Example-umbrella.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | 4 | FOUNDATION_EXPORT double Pods_Redux_ExampleVersionNumber; 5 | FOUNDATION_EXPORT const unsigned char Pods_Redux_ExampleVersionString[]; 6 | 7 | -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Redux (0.1.0) 3 | 4 | DEPENDENCIES: 5 | - Redux (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | Redux: 9 | :path: ../ 10 | 11 | SPEC CHECKSUMS: 12 | Redux: 4d4efc76529b5b98a4536256e6392c9761753409 13 | 14 | COCOAPODS: 0.38.2 15 | -------------------------------------------------------------------------------- /Example/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Redux (0.1.0) 3 | 4 | DEPENDENCIES: 5 | - Redux (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | Redux: 9 | :path: ../ 10 | 11 | SPEC CHECKSUMS: 12 | Redux: 4d4efc76529b5b98a4536256e6392c9761753409 13 | 14 | COCOAPODS: 0.38.2 15 | -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | source 'https://github.com/CocoaPods/Specs.git' 2 | use_frameworks! 3 | 4 | target 'Redux_Example', :exclusive => true do 5 | pod "Redux", :path => "../" 6 | end 7 | 8 | target 'Redux_Tests', :exclusive => true do 9 | pod "Redux", :path => "../" 10 | 11 | 12 | end 13 | -------------------------------------------------------------------------------- /Example/Redux.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.swiftlint.yml: -------------------------------------------------------------------------------- 1 | included: # paths to include during linting. `--path` is ignored if present. 2 | - Pod 3 | - Example/Tests 4 | - Example/Redux 5 | 6 | disabled_rules: # rule identifiers to exclude from running 7 | - force_cast 8 | - valid_docs 9 | 10 | line_length: 80 11 | function_body_length: 12 | - 80 # warning 13 | - 120 # error 14 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Redux/Redux-Private.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Redux.xcconfig" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Private/Redux" "${PODS_ROOT}/Headers/Public" 4 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 5 | PODS_ROOT = ${SRCROOT} 6 | SKIP_INSTALL = YES -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Redux_Tests/Pods-Redux_Tests.debug.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 3 | OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/Redux.framework/Headers" 4 | OTHER_LDFLAGS = $(inherited) -framework "Redux" 5 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 6 | PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-Redux_Tests 7 | PODS_ROOT = ${SRCROOT}/Pods -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Redux_Tests/Pods-Redux_Tests.release.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 3 | OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/Redux.framework/Headers" 4 | OTHER_LDFLAGS = $(inherited) -framework "Redux" 5 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 6 | PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-Redux_Tests 7 | PODS_ROOT = ${SRCROOT}/Pods -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Redux_Example/Pods-Redux_Example.debug.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 3 | OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/Redux.framework/Headers" 4 | OTHER_LDFLAGS = $(inherited) -framework "Redux" 5 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 6 | PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-Redux_Example 7 | PODS_ROOT = ${SRCROOT}/Pods -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Redux_Example/Pods-Redux_Example.release.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 3 | OTHER_CFLAGS = $(inherited) -iquote "$CONFIGURATION_BUILD_DIR/Redux.framework/Headers" 4 | OTHER_LDFLAGS = $(inherited) -framework "Redux" 5 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 6 | PODS_FRAMEWORK_BUILD_PATH = $(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/Pods-Redux_Example 7 | PODS_ROOT = ${SRCROOT}/Pods -------------------------------------------------------------------------------- /Pod/Classes/StoreType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StoreType.swift 3 | // Pods 4 | // 5 | // Created by Steven Chan on 30/12/15. 6 | // 7 | // 8 | 9 | public protocol StoreType { 10 | static var appStore: ReduxStore { get } 11 | 12 | static func configureStore() -> ReduxStore 13 | } 14 | 15 | private struct StoreContainer { 16 | static var store: ReduxStore? 17 | } 18 | 19 | public extension StoreType { 20 | static var appStore: ReduxStore { 21 | 22 | if StoreContainer.store == nil { 23 | StoreContainer.store = configureStore() 24 | } 25 | 26 | return StoreContainer.store! 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Example/Redux/Store.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Store.swift 3 | // SwiftRedux 4 | // 5 | // Created by Steven Chan on 31/12/15. 6 | // Copyright (c) 2016 Oursky Limited. All rights reserved. 7 | // 8 | 9 | import Redux 10 | 11 | class Store: StoreType { 12 | 13 | static func configureStore() -> ReduxStore { 14 | 15 | let initialState = AppState( 16 | todoList: TodoListState(list: [TodoListItem]()) 17 | ) 18 | 19 | let reducers: [String: Reducer] = [ 20 | kAppStateKeyTodoList: todoListReducer, 21 | ] 22 | 23 | return createStore( 24 | combineReducers(reducers), 25 | initialState: initialState 26 | ) 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/Redux.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Redux", 3 | "version": "0.1.0", 4 | "summary": "Swift implementation of Redux.", 5 | "description": "A Swift implementation of rackt/redux by Dan Abramov and the React Community.", 6 | "homepage": "https://github.com/oursky/Redux", 7 | "license": "MIT", 8 | "authors": { 9 | "Steven-Chan": "stevenchan@oursky.com" 10 | }, 11 | "source": { 12 | "git": "https://github.com/oursky/Redux.git", 13 | "tag": "0.1.0" 14 | }, 15 | "platforms": { 16 | "ios": "8.0" 17 | }, 18 | "requires_arc": true, 19 | "source_files": "Pod/Classes/**/*", 20 | "resource_bundles": { 21 | "Redux": [ 22 | "Pod/Assets/*.png" 23 | ] 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OS X 2 | .DS_Store 3 | 4 | # Xcode 5 | build/ 6 | *.pbxuser 7 | !default.pbxuser 8 | *.mode1v3 9 | !default.mode1v3 10 | *.mode2v3 11 | !default.mode2v3 12 | *.perspectivev3 13 | !default.perspectivev3 14 | xcuserdata 15 | *.xccheckout 16 | profile 17 | *.moved-aside 18 | DerivedData 19 | *.hmap 20 | *.ipa 21 | 22 | # Bundler 23 | .bundle 24 | 25 | Carthage 26 | # We recommend against adding the Pods directory to your .gitignore. However 27 | # you should judge for yourself, the pros and cons are mentioned at: 28 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 29 | # 30 | # Note: if you ignore the Pods directory, make sure to uncomment 31 | # `pod install` in .travis.yml 32 | # 33 | # Pods/ 34 | -------------------------------------------------------------------------------- /Example/Redux/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Example/Tests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Example/Tests/TodoListActionTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TodoListActionTests.swift 3 | // Redux 4 | // 5 | // Created by Steven Chan on 5/1/16. 6 | // Copyright (c) 2016 Oursky Limited. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | import Redux 11 | 12 | class TodoListActionTests: XCTestCase { 13 | 14 | let mockUserDefaults: UserDefaults = 15 | UserDefaults(suiteName: "TodoListActionTests")! 16 | let mockDispatch: MockDispatch = createMockDispatch() 17 | 18 | override func setUp() { 19 | super.setUp() 20 | } 21 | 22 | override func tearDown() { 23 | super.tearDown() 24 | 25 | let dict = mockUserDefaults.dictionaryRepresentation() 26 | for (k, _) in dict { 27 | mockUserDefaults.removeObject(forKey: k) 28 | } 29 | mockDispatch.cleanup() 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Redux/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 0.1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Redux_Example/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Redux_Tests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pod/Classes/ProgrammerAssertions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ProgrammerAssertions.swift 3 | // Pods 4 | // 5 | // Created by Steven Chan on 4/1/16. 6 | // 7 | // 8 | 9 | import Foundation 10 | 11 | public func fatalError( 12 | _ message: @autoclosure () -> String = "", 13 | file: StaticString = #file, 14 | line: UInt = #line 15 | ) -> Never { 16 | Assertions.fatalErrorClosure(message(), file, line) 17 | runForever() 18 | } 19 | 20 | // Stores custom assertions closures, 21 | // by default it points to Swift functions. But test target can override them. 22 | open class Assertions { 23 | open static var fatalErrorClosure = 24 | swiftFatalErrorClosure 25 | 26 | open static let swiftFatalErrorClosure = { 27 | Swift.fatalError($0, file: $1, line: $2) 28 | } 29 | } 30 | 31 | // This is a `noreturn` function that runs forever and doesn't return. 32 | // Used by assertions with `@noreturn`. 33 | private func runForever() -> Never { 34 | repeat { 35 | RunLoop.current.run() 36 | } while (true) 37 | } 38 | -------------------------------------------------------------------------------- /Example/Redux/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // Redux 4 | // 5 | // Created by Steven-Chan on 01/04/2016. 6 | // Copyright (c) 2016 Oursky Limited. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | func application( 17 | _ application: UIApplication, 18 | didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]? 19 | ) -> Bool { 20 | // Override point for customization after application launch. 21 | return true 22 | } 23 | 24 | func applicationWillResignActive(_ application: UIApplication) { 25 | } 26 | 27 | func applicationDidEnterBackground(_ application: UIApplication) { 28 | } 29 | 30 | func applicationWillEnterForeground(_ application: UIApplication) { 31 | } 32 | 33 | func applicationDidBecomeActive(_ application: UIApplication) { 34 | } 35 | 36 | func applicationWillTerminate(_ application: UIApplication) { 37 | } 38 | 39 | } 40 | -------------------------------------------------------------------------------- /Pod/Classes/combineReducers.swift: -------------------------------------------------------------------------------- 1 | // 2 | // combineReducers.swift 3 | // Redux.swift 4 | // 5 | // Created by Mark Wise on 11/4/15. 6 | // Copyright © 2015 InstaJams. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public func combineReducers(_ reducers: [String: Reducer]) -> Reducer { 12 | func combination(_ previousState: Any, action: ReduxAction) -> Any { 13 | if let appState = previousState as? ReduxAppState { 14 | var nextState: ReduxAppState = appState 15 | for (key, reducer) in reducers { 16 | if let previousStateForKey = nextState.get(key) { 17 | let nextStateForKey = reducer(previousStateForKey, action) 18 | if let ns = nextStateForKey as? AnyEquatable { 19 | nextState.set(key, value: ns) 20 | } else { 21 | print("AppState value must conform AnyEquatable") 22 | } 23 | } 24 | } 25 | return nextState 26 | } 27 | return previousState 28 | } 29 | return combination 30 | } 31 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016 Oursky Limited 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /Example/Redux/AppState.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppState.swift 3 | // SwiftRedux 4 | // 5 | // Created by Steven Chan on 31/12/15. 6 | // Copyright (c) 2016 Oursky Limited. All rights reserved. 7 | // 8 | 9 | import Redux 10 | 11 | let kAppStateKeyTodoList = "todoList" 12 | 13 | struct AppState: ReduxAppState, AnyEquatable, Equatable { 14 | var todoList: TodoListState 15 | 16 | func get(_ key: String) -> AnyEquatable? { 17 | switch key { 18 | case kAppStateKeyTodoList: return self.todoList 19 | default: return nil 20 | } 21 | } 22 | 23 | mutating func set(_ key: String, value: AnyEquatable) { 24 | switch key { 25 | case kAppStateKeyTodoList: 26 | self.todoList = value as! TodoListState 27 | break 28 | default: 29 | break 30 | } 31 | } 32 | } 33 | 34 | func == (lhs: AppState, rhs: AppState) -> Bool { 35 | return lhs.todoList == rhs.todoList 36 | } 37 | 38 | 39 | extension ReduxStore { 40 | 41 | func getTodoListState() -> TodoListState? { 42 | return getAppState()!.get(kAppStateKeyTodoList) as? TodoListState 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: objective-c 2 | osx_image: xcode8 3 | 4 | before_install: 5 | - brew update 6 | - brew install swiftlint 7 | 8 | script: 9 | - set -o pipefail 10 | - xcodebuild -version 11 | - xcodebuild -showsdks 12 | - xcodebuild -scheme "$SCHEME" -workspace "$WORKSPACE" -sdk "$SDK" -destination "$DESTINATION" build test | xcpretty 13 | - pod lib lint 14 | - swiftlint version 15 | - swiftlint 16 | 17 | after_success: 18 | - bash <(curl -s https://codecov.io/bash) 19 | 20 | env: 21 | global: 22 | - LC_CTYPE=en_US.UTF-8 23 | - LANG=en_US.UTF-8 24 | - WORKSPACE=Example/Redux.xcworkspace 25 | - FRAMEWORK_NAME="Redux" 26 | - IOS_FRAMEWORK_SCHEME="Redux" 27 | - IOS_SDK=iphonesimulator 28 | matrix: 29 | - DESTINATION="OS=8.3,name=iPhone 5S" SCHEME="$IOS_FRAMEWORK_SCHEME" SDK="$IOS_SDK" 30 | - DESTINATION="OS=8.4,name=iPhone 6" SCHEME="$IOS_FRAMEWORK_SCHEME" SDK="$IOS_SDK" 31 | - DESTINATION="OS=9.0,name=iPhone 6 Plus" SCHEME="$IOS_FRAMEWORK_SCHEME" SDK="$IOS_SDK" 32 | - DESTINATION="OS=9.1,name=iPhone 6S" SCHEME="$IOS_FRAMEWORK_SCHEME" SDK="$IOS_SDK" 33 | - DESTINATION="OS=9.2,name=iPhone 6S Plus" SCHEME="$IOS_FRAMEWORK_SCHEME" SDK="$IOS_SDK" 34 | -------------------------------------------------------------------------------- /Example/Tests/MockDispatch.swift: -------------------------------------------------------------------------------- 1 | // 2 | // MockDispatch.swift 3 | // Redux 4 | // 5 | // Created by Steven Chan on 5/1/16. 6 | // Copyright © 2016 oursky. All rights reserved. 7 | // 8 | 9 | import Redux 10 | 11 | class MockDispatch { 12 | 13 | let dispatch: DispatchFunction 14 | let getDispatchedActions: () -> [ReduxAction] 15 | let cleanup: () -> () 16 | 17 | init( 18 | dispatch: @escaping DispatchFunction, 19 | getDispatchedActions: @escaping () -> [ReduxAction], 20 | cleanup: @escaping () -> () 21 | ) { 22 | self.dispatch = dispatch 23 | self.cleanup = cleanup 24 | self.getDispatchedActions = getDispatchedActions 25 | } 26 | 27 | } 28 | 29 | func createMockDispatch() -> MockDispatch { 30 | 31 | var dispatchedActions = [ReduxAction]() 32 | 33 | func getDispatchedActions() -> [ReduxAction] { 34 | return dispatchedActions 35 | } 36 | 37 | func dispatch(_ action: ReduxAction) { 38 | dispatchedActions.append(action) 39 | } 40 | 41 | func cleanup() { 42 | dispatchedActions.removeAll() 43 | } 44 | 45 | return MockDispatch( 46 | dispatch: dispatch, 47 | getDispatchedActions: getDispatchedActions, 48 | cleanup: cleanup 49 | ) 50 | } 51 | -------------------------------------------------------------------------------- /Example/Redux/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 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 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /Example/Redux/TodoListItem.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TodoListItem.swift 3 | // SwiftRedux 4 | // 5 | // Created by Steven Chan on 31/12/15. 6 | // Copyright (c) 2016 Oursky Limited. All rights reserved. 7 | // 8 | 9 | import Redux 10 | 11 | public struct TodoListItem: AnyEquatable, Equatable { 12 | var content: String 13 | var createdAt: NSDate? 14 | 15 | var token: NSString 16 | 17 | init(content: String, createdAt: NSDate) { 18 | self.content = content 19 | self.createdAt = createdAt 20 | self.token = "" 21 | } 22 | 23 | init(content: String, token: NSString) { 24 | self.content = content 25 | self.createdAt = nil 26 | self.token = token 27 | } 28 | 29 | init(dict: [String: AnyObject]) { 30 | self.content = dict["content"] as! String 31 | self.createdAt = dict["createdAt"] as! NSDate? 32 | self.token = "" 33 | } 34 | 35 | func toDict() -> [String: AnyObject] { 36 | return [ 37 | "content": content as AnyObject, 38 | "createdAt": createdAt! 39 | ] 40 | } 41 | } 42 | 43 | public func == (lhs: TodoListItem, rhs: TodoListItem) -> Bool { 44 | return lhs.content == rhs.content && 45 | lhs.createdAt === rhs.createdAt && 46 | lhs.createdAt!.isEqual(to: rhs.createdAt! as Date) 47 | } 48 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Redux_Tests/Pods-Redux_Tests-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## Redux 5 | 6 | Copyright (c) 2016 Steven-Chan 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in 16 | all copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | THE SOFTWARE. 25 | 26 | Generated by CocoaPods - http://cocoapods.org 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Redux_Example/Pods-Redux_Example-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## Redux 5 | 6 | Copyright (c) 2016 Steven-Chan 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in 16 | all copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | THE SOFTWARE. 25 | 26 | Generated by CocoaPods - http://cocoapods.org 27 | -------------------------------------------------------------------------------- /Example/Redux/TodoListReducer.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TodoListReducer.swift 3 | // SwiftRedux 4 | // 5 | // Created by Steven Chan on 31/12/15. 6 | // Copyright (c) 2016 Oursky Limited. All rights reserved. 7 | // 8 | 9 | import Redux 10 | 11 | 12 | struct TodoListState: AnyEquatable, Equatable { 13 | var list: [TodoListItem] 14 | } 15 | 16 | func == (lhs: TodoListState, rhs: TodoListState) -> Bool { 17 | return lhs.list == rhs.list 18 | } 19 | 20 | 21 | func todoListReducer(_ previousState: Any, action: ReduxAction) -> Any { 22 | var state = previousState as! TodoListState 23 | 24 | print("action: ", action) 25 | 26 | switch action.payload { 27 | case TodoListAction.loadSuccess(let list): 28 | state.list = list 29 | break 30 | 31 | case TodoListAction.add(let token, let content): 32 | state.list.append( 33 | TodoListItem( 34 | content: content, 35 | token: token as NSString 36 | ) 37 | ) 38 | break 39 | case TodoListAction.addSuccess(let token, let createdAt): 40 | state.list = state.list.map { 41 | item in 42 | item.token as String == token ? 43 | TodoListItem(content: item.content, createdAt: createdAt) : 44 | item 45 | } 46 | break 47 | case TodoListAction.addFail(let token): 48 | state.list = state.list.filter { 49 | item in item.token as String != token 50 | } 51 | break 52 | 53 | default: 54 | break 55 | } 56 | return state 57 | } 58 | -------------------------------------------------------------------------------- /Redux.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # Be sure to run `pod lib lint Redux.podspec' to ensure this is a 3 | # valid spec before submitting. 4 | # 5 | # Any lines starting with a # are optional, but their use is encouraged 6 | # To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html 7 | # 8 | 9 | Pod::Spec.new do |s| 10 | s.name = "Redux" 11 | s.version = "0.1.2" 12 | s.summary = "Swift implementation of Redux." 13 | 14 | # This description is used to generate tags and improve search results. 15 | # * Think: What does it do? Why did you write it? What is the focus? 16 | # * Try to keep it short, snappy and to the point. 17 | # * Write the description between the DESC delimiters below. 18 | # * Finally, don't worry about the indent, CocoaPods strips it! 19 | s.description = <<-DESC 20 | A Swift implementation of rackt/redux by Dan Abramov and the React Community. 21 | DESC 22 | 23 | s.homepage = "https://github.com/oursky/Redux" 24 | # s.screenshots = "www.example.com/screenshots_1", "www.example.com/screenshots_2" 25 | s.license = 'MIT' 26 | s.author = { "Steven-Chan" => "stevenchan@oursky.com" } 27 | s.source = { :git => "https://github.com/oursky/Redux.git", :tag => s.version.to_s } 28 | # s.social_media_url = 'https://twitter.com/' 29 | 30 | s.platform = :ios, '8.0' 31 | s.requires_arc = true 32 | 33 | s.source_files = 'Pod/Classes/**/*' 34 | 35 | # s.public_header_files = 'Pod/Classes/**/*.h' 36 | # s.frameworks = 'UIKit', 'MapKit' 37 | # s.dependency 'AFNetworking', '~> 2.3' 38 | end 39 | -------------------------------------------------------------------------------- /Pod/Classes/createStore.swift: -------------------------------------------------------------------------------- 1 | // 2 | // createStore.swift 3 | // Redux.swift 4 | // 5 | // Created by Mark Wise on 11/4/15. 6 | // Copyright © 2015 InstaJams. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public func createStore( 12 | _ reducer: @escaping Reducer, 13 | initialState: AnyEquatable 14 | ) -> ReduxStore { 15 | var currentReducer = reducer 16 | var currentState = initialState 17 | var listeners = [UUID: Listener]() 18 | var isDispatching = false 19 | 20 | func getState() -> ReduxState { 21 | return currentState 22 | } 23 | 24 | func subscribe(_ listener: @escaping Listener) -> () -> Void { 25 | let uuid = UUID() 26 | listeners[uuid] = listener 27 | var isSubscribed = true 28 | 29 | func unsubscribe() { 30 | if !isSubscribed { 31 | return 32 | } 33 | 34 | isSubscribed = false 35 | _ = listeners.removeValue(forKey: uuid) 36 | } 37 | return unsubscribe 38 | } 39 | 40 | 41 | func dispatch(_ action: ReduxAction) { 42 | if isDispatching { 43 | /* 44 | Using fatalError you do not need try/catch in every dispatch. 45 | */ 46 | fatalError("Cannot dispatch in a middle of dispatch") 47 | } 48 | 49 | defer { 50 | isDispatching = false 51 | } 52 | 53 | isDispatching = true 54 | let nextState = currentReducer( 55 | currentState, 56 | action 57 | ) 58 | if let ns = nextState as? AnyEquatable { 59 | currentState = ns 60 | } 61 | 62 | for listener in listeners.values { 63 | listener() 64 | } 65 | } 66 | 67 | func replaceReducer(_ nextReducer: @escaping Reducer) -> Void { 68 | currentReducer = nextReducer 69 | 70 | dispatch(ReduxAction(payload: ActionTypes.init as! ReduxActionType)) 71 | } 72 | 73 | dispatch(ReduxAction(payload: ActionTypes.init as! ReduxActionType)) 74 | 75 | return ReduxStore( 76 | dispatch: dispatch, 77 | getState: getState, 78 | replaceReducer: replaceReducer, 79 | subscribe: subscribe 80 | ) 81 | } 82 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Redux_Tests/Pods-Redux_Tests-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Copyright (c) 2016 Steven-Chan <stevenchan@oursky.com> 18 | 19 | Permission is hereby granted, free of charge, to any person obtaining a copy 20 | of this software and associated documentation files (the "Software"), to deal 21 | in the Software without restriction, including without limitation the rights 22 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 23 | copies of the Software, and to permit persons to whom the Software is 24 | furnished to do so, subject to the following conditions: 25 | 26 | The above copyright notice and this permission notice shall be included in 27 | all copies or substantial portions of the Software. 28 | 29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 34 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 35 | THE SOFTWARE. 36 | 37 | Title 38 | Redux 39 | Type 40 | PSGroupSpecifier 41 | 42 | 43 | FooterText 44 | Generated by CocoaPods - http://cocoapods.org 45 | Title 46 | 47 | Type 48 | PSGroupSpecifier 49 | 50 | 51 | StringsTable 52 | Acknowledgements 53 | Title 54 | Acknowledgements 55 | 56 | 57 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Redux_Example/Pods-Redux_Example-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Copyright (c) 2016 Steven-Chan <stevenchan@oursky.com> 18 | 19 | Permission is hereby granted, free of charge, to any person obtaining a copy 20 | of this software and associated documentation files (the "Software"), to deal 21 | in the Software without restriction, including without limitation the rights 22 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 23 | copies of the Software, and to permit persons to whom the Software is 24 | furnished to do so, subject to the following conditions: 25 | 26 | The above copyright notice and this permission notice shall be included in 27 | all copies or substantial portions of the Software. 28 | 29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 34 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 35 | THE SOFTWARE. 36 | 37 | Title 38 | Redux 39 | Type 40 | PSGroupSpecifier 41 | 42 | 43 | FooterText 44 | Generated by CocoaPods - http://cocoapods.org 45 | Title 46 | 47 | Type 48 | PSGroupSpecifier 49 | 50 | 51 | StringsTable 52 | Acknowledgements 53 | Title 54 | Acknowledgements 55 | 56 | 57 | -------------------------------------------------------------------------------- /Example/Tests/StoreTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StoreTests.swift 3 | // SwiftRedux 4 | // 5 | // Created by Steven Chan on 30/12/15. 6 | // Copyright © 2015 CocoaPods. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | @testable import Redux 11 | 12 | 13 | class StoreTests: XCTestCase { 14 | 15 | var store: ReduxStore? 16 | 17 | override func setUp() { 18 | super.setUp() 19 | store = Store.configureStore() 20 | } 21 | 22 | override func tearDown() { 23 | super.tearDown() 24 | } 25 | 26 | func testGetState() { 27 | XCTAssert(store?.getCountState() == CounterState(count: 0)) 28 | XCTAssert(store?.getListState() == ListState(list: [String]())) 29 | } 30 | 31 | func testDispatch() { 32 | store?.dispatch(ReduxAction(payload: CounterAction.increment)) 33 | store?.dispatch(ReduxAction(payload: ListAction.append("hi"))) 34 | 35 | XCTAssert(store?.getCountState()!.count == 1) 36 | XCTAssert((store?.getListState()!.list)! == [ "hi" ]) 37 | XCTAssert((store?.getListState()!.list)! != [ "bye" ]) 38 | } 39 | 40 | func testDispatchWithinDispatch() { 41 | expectFatalError { 42 | self.store?.dispatch( 43 | ReduxAction( 44 | payload: CounterAction.dispatchWithinDispatch(self.store!) 45 | ) 46 | ) 47 | } 48 | } 49 | 50 | func testSubcribe() { 51 | let expectation = self.expectation(description: "subscribed action") 52 | 53 | var result: [[String]] = [[String]]() 54 | 55 | func render() { 56 | result.append((store?.getListState()!.list)!) 57 | 58 | if result.count == 2 { 59 | XCTAssert(result[0] == [ "Now" ]) 60 | XCTAssert(result[1] == [ "Now", "You see me" ]) 61 | expectation.fulfill() 62 | } 63 | } 64 | 65 | let unsubscribe = store?.subscribe(render) 66 | 67 | store?.dispatch( 68 | ReduxAction(payload: ListAction.append("Now")) 69 | ) 70 | store?.dispatch( 71 | ReduxAction(payload: ListAction.append("You see me")) 72 | ) 73 | 74 | unsubscribe!() 75 | 76 | store?.dispatch( 77 | ReduxAction(payload: ListAction.append("Now you don't")) 78 | ) 79 | 80 | self.waitForExpectations(timeout: 0.5) { (error) -> Void in 81 | XCTAssert(result.count == 2) 82 | } 83 | } 84 | 85 | } 86 | -------------------------------------------------------------------------------- /Pod/Classes/types.swift: -------------------------------------------------------------------------------- 1 | // 2 | // types.swift 3 | // Redux.swift 4 | // 5 | // Created by Mark Wise on 11/6/15. 6 | // Copyright © 2015 InstaJams. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public typealias ActionCreator = (_ args: Any...) -> ReduxAction 12 | public typealias ActionType = String 13 | public typealias ReduxAppState = KeyValueEqutable 14 | public typealias DispatchFunction = (_ action: ReduxAction) -> Void 15 | public typealias FunctionWithArgs = (_ args: Any...) -> Void 16 | public typealias Listener = () -> Void 17 | public typealias Reducer = (_ previousState: Any, _ action: ReduxAction) -> Any 18 | public typealias ReduxState = AnyEquatable 19 | 20 | public protocol AnyEquatable { 21 | func equals(_ otherObject: AnyEquatable) -> Bool 22 | } 23 | 24 | public extension AnyEquatable where Self: Equatable { 25 | // otherObject could also be 'Any' 26 | func equals(_ otherObject: AnyEquatable) -> Bool { 27 | if let otherAsSelf = otherObject as? Self { 28 | return otherAsSelf == self 29 | } 30 | return false 31 | } 32 | } 33 | 34 | public protocol KeyValueEqutable { 35 | func get(_ key: String) -> AnyEquatable? 36 | mutating func set(_ key: String, value: AnyEquatable) 37 | } 38 | 39 | public enum ActionTypes: ReduxActionType { 40 | case `init` 41 | } 42 | 43 | public protocol ReduxActionType {} 44 | 45 | public struct ReduxAction { 46 | public var payload: ReduxActionType 47 | 48 | public init(payload: ReduxActionType) { 49 | self.payload = payload 50 | } 51 | } 52 | 53 | open class ReduxStore { 54 | open let dispatch: DispatchFunction 55 | open let getState: () -> ReduxState 56 | open let replaceReducer: (_ nextReducer: @escaping Reducer) -> Void 57 | open let subscribe: (_ listener: @escaping Listener) -> () -> Void 58 | 59 | public init( 60 | dispatch: @escaping DispatchFunction, 61 | getState: @escaping () -> ReduxState, 62 | replaceReducer: @escaping (_ nextReducer: @escaping Reducer) -> Void, 63 | subscribe: @escaping (_ listener: @escaping Listener) -> () -> Void 64 | ) { 65 | self.dispatch = dispatch 66 | self.getState = getState 67 | self.replaceReducer = replaceReducer 68 | self.subscribe = subscribe 69 | } 70 | } 71 | 72 | 73 | public extension ReduxStore { 74 | func getAppState() -> ReduxAppState? { 75 | return getState() as? ReduxAppState 76 | } 77 | } 78 | 79 | 80 | public enum ReduxSwiftError: Error { 81 | case reducerDispatchError 82 | } 83 | -------------------------------------------------------------------------------- /Example/Redux/TodoListAction.swift: -------------------------------------------------------------------------------- 1 | // 2 | // TodoListAction.swift 3 | // SwiftRedux 4 | // 5 | // Created by Steven Chan on 31/12/15. 6 | // Copyright (c) 2016 Oursky Limited. All rights reserved. 7 | // 8 | 9 | import Redux 10 | 11 | let kTodoListUserDefaultsKey = "SwiftRedux.example.TodoList" 12 | 13 | public enum TodoListAction: ReduxActionType { 14 | case load 15 | case loadSuccess(list: [TodoListItem]) 16 | case loadFail 17 | 18 | case add(token: String, content: String) 19 | case addSuccess(token: String, createdAt: NSDate) 20 | case addFail(token: String) 21 | } 22 | 23 | 24 | public struct TodoListActionCreators { 25 | 26 | static func load( 27 | _ dispatch: @escaping DispatchFunction, 28 | userDefaults: UserDefaults 29 | ) { 30 | dispatch( 31 | ReduxAction(payload: TodoListAction.load) 32 | ) 33 | 34 | let list = userDefaults 35 | .array(forKey: kTodoListUserDefaultsKey) ?? [Any]() 36 | 37 | let itemList = list.map { 38 | (item: Any) in 39 | TodoListItem(dict: (item as! [String: AnyObject])) 40 | } 41 | 42 | 43 | // need some time to load 44 | delay(1.0) { 45 | dispatch( 46 | ReduxAction( 47 | payload: TodoListAction.loadSuccess(list: itemList) 48 | ) 49 | ) 50 | } 51 | } 52 | 53 | static func add( 54 | _ content: String, 55 | dispatch: DispatchFunction, 56 | userDefaults: UserDefaults 57 | ) { 58 | let token = NSUUID().uuidString 59 | dispatch( 60 | ReduxAction( 61 | payload: TodoListAction.add(token: token, content: content) 62 | ) 63 | ) 64 | 65 | let createdAt = NSDate() 66 | let newItem = TodoListItem(content: content, createdAt: createdAt) 67 | 68 | var list = userDefaults 69 | .array(forKey: kTodoListUserDefaultsKey) ?? [AnyObject]() 70 | 71 | list.append(newItem.toDict()) 72 | 73 | userDefaults.set(list, forKey: kTodoListUserDefaultsKey) 74 | userDefaults.synchronize() 75 | 76 | dispatch( 77 | ReduxAction( 78 | payload: TodoListAction.addSuccess( 79 | token: token, 80 | createdAt: createdAt 81 | ) 82 | ) 83 | ) 84 | } 85 | 86 | } 87 | 88 | 89 | // delay helper 90 | func delay(_ delay: Double, closure:@escaping ()->()) { 91 | DispatchQueue.main.asyncAfter(deadline: .now() + delay) { 92 | closure() 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Redux 2 | 3 | [![CI Status](http://img.shields.io/travis/oursky/Redux.svg?style=flat)](https://travis-ci.org/oursky/Redux) 4 | [![codecov.io](https://codecov.io/github/oursky/Redux/coverage.svg?branch=master)](https://codecov.io/github/oursky/Redux?branch=master) 5 | [![Version](https://img.shields.io/cocoapods/v/Redux.svg?style=flat)](http://cocoapods.org/pods/Redux) 6 | [![License](https://img.shields.io/cocoapods/l/Redux.svg?style=flat)](http://cocoapods.org/pods/Redux) 7 | [![Platform](https://img.shields.io/cocoapods/p/Redux.svg?style=flat)](http://cocoapods.org/pods/Redux) 8 | 9 | Redux is a swift implementation of [redux](https://github.com/rackt/redux). 10 | 11 | A thorough walk through and description of the framework can be found at the official Redux repository: [redux](http://redux.js.org/index.html). 12 | 13 | ## Features 14 | 15 | - Project scaffolding, includes basic redux structure and test cases 16 | - File templates 17 | - Static typed State 18 | - Handy functions for integrating with UIViewController, similar to [react-redux](https://github.com/rackt/react-redux) 19 | 20 | ## Getting Started 21 | 22 | ### Quick Start from [Project Template](https://github.com/oursky/Redux-Project-Template) 23 | 24 | Start with our project template 25 | 26 | ```bash 27 | curl https://raw.githubusercontent.com/oursky/Redux-Project-Template/master/download | bash -s YOUR_PROJECT_NAME 28 | ``` 29 | 30 | ### Add to an existing project with [CocoaPods](https://guides.cocoapods.org/) 31 | 32 | Add the following in Podfile 33 | ```ruby 34 | source 'https://github.com/CocoaPods/Specs.git' 35 | platform :ios, '8.0' 36 | 37 | pod "Redux", "~> 0.1.0" 38 | ``` 39 | 40 | Then, run the following command 41 | ```bash 42 | pod install 43 | ``` 44 | 45 | ## Install Xcode Redux File Templates 46 | 47 | Run the following command 48 | ```bash 49 | # if your XCode path is '/Applications/Xcode.app' 50 | curl https://raw.githubusercontent.com/oursky/Redux-Project-Template/file-templates/install-template.sh | bash -s 51 | 52 | # else 53 | curl https://raw.githubusercontent.com/oursky/Redux-Project-Template/file-templates/install-template.sh | bash -s YOUR_XCODE_PATH 54 | ``` 55 | 56 | Then, you may open Xcode, go to `File -> New -> File...`, you should be able to find the file templates under `Redux` 57 | 58 | See https://github.com/oursky/Redux-Project-Template/tree/file-templates 59 | 60 | ## Try Example 61 | 62 | ```bash 63 | git clone git@github.com:oursky/Redux.git 64 | cd Redux 65 | pod install --project-directory=Example 66 | open Example/Redux.xcworkspace 67 | ``` 68 | 69 | Then you may run **Redux-Example** in XCode 70 | 71 | ## Credit 72 | 73 | Inspired from 74 | - https://github.com/rackt/redux 75 | - https://github.com/mwise/Redux.swift 76 | 77 | ## License 78 | 79 | Redux is available under the MIT license. See the LICENSE file for more info. 80 | -------------------------------------------------------------------------------- /Pod/Classes/StoreConnector.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StoreConnector.swift 3 | // Pods 4 | // 5 | // Created by Steven Chan on 30/12/15. 6 | // 7 | // 8 | 9 | import UIKit 10 | 11 | public protocol StoreDelegate { 12 | 13 | func storeDidUpdateState(_ lastState: ReduxAppState) 14 | 15 | } 16 | 17 | open class StoreConnector { 18 | typealias Disconnect = () -> Void 19 | 20 | var connections: [Int: Disconnect] = [Int: Disconnect]() 21 | 22 | func connect(_ store: ReduxStore, keys: [String], delegate: StoreDelegate) { 23 | let address: Int = unsafeBitCast(store, to: Int.self) 24 | 25 | var lastState: ReduxAppState? 26 | if let storeState = store.getState() as? ReduxAppState { 27 | lastState = storeState 28 | } 29 | 30 | connections[address] = store.subscribe { 31 | if let storeState = store.getState() as? ReduxAppState { 32 | 33 | let k: [String] = keys.filter { 34 | if let storeValue = storeState.get($0), 35 | let lastValue = lastState?.get($0) { 36 | return !storeValue.equals(lastValue) 37 | } 38 | return false 39 | } 40 | 41 | if k.count > 0 && lastState != nil { 42 | delegate.storeDidUpdateState(lastState!) 43 | } 44 | 45 | lastState = storeState 46 | } 47 | } 48 | } 49 | 50 | func disconnect(_ store: ReduxStore) { 51 | let address: Int = unsafeBitCast(store, to: Int.self) 52 | connections[address]!() 53 | connections.removeValue(forKey: address) 54 | } 55 | } 56 | 57 | public extension UIViewController { 58 | fileprivate struct AssociatedKeys { 59 | static var connector: StoreConnector? 60 | } 61 | 62 | var storeConnector: StoreConnector? { 63 | get { 64 | return objc_getAssociatedObject( 65 | self, 66 | &AssociatedKeys.connector 67 | ) as? StoreConnector 68 | } 69 | set { 70 | if let newValue = newValue { 71 | objc_setAssociatedObject( 72 | self, 73 | &AssociatedKeys.connector, 74 | newValue as AnyObject, 75 | objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC 76 | ) 77 | } 78 | } 79 | } 80 | 81 | func connect(_ store: ReduxStore, keys: [String], delegate: StoreDelegate) { 82 | if storeConnector == nil { 83 | storeConnector = StoreConnector() 84 | } 85 | 86 | storeConnector?.connect(store, keys: keys, delegate: delegate) 87 | } 88 | 89 | func disconnect(_ store: ReduxStore) { 90 | storeConnector?.disconnect(store) 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Redux_Tests/Pods-Redux_Tests-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 5 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 6 | 7 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 8 | 9 | install_framework() 10 | { 11 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 12 | local source="${BUILT_PRODUCTS_DIR}/$1" 13 | else 14 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 15 | fi 16 | 17 | local destination="${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 18 | 19 | if [ -L "${source}" ]; then 20 | echo "Symlinked..." 21 | source="$(readlink "${source}")" 22 | fi 23 | 24 | # use filter instead of exclude so missing patterns dont' throw errors 25 | echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 26 | rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 27 | 28 | # Resign the code if required by the build settings to avoid unstable apps 29 | code_sign_if_enabled "${destination}/$(basename "$1")" 30 | 31 | # Embed linked Swift runtime libraries 32 | local basename 33 | basename="$(basename "$1" | sed -E s/\\..+// && exit ${PIPESTATUS[0]})" 34 | local swift_runtime_libs 35 | swift_runtime_libs=$(xcrun otool -LX "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/${basename}.framework/${basename}" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 36 | for lib in $swift_runtime_libs; do 37 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 38 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 39 | code_sign_if_enabled "${destination}/${lib}" 40 | done 41 | } 42 | 43 | # Signs a framework with the provided identity 44 | code_sign_if_enabled() { 45 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 46 | # Use the current code_sign_identitiy 47 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 48 | echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements \"$1\"" 49 | /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements "$1" 50 | fi 51 | } 52 | 53 | 54 | if [[ "$CONFIGURATION" == "Debug" ]]; then 55 | install_framework 'Pods-Redux_Tests/Redux.framework' 56 | fi 57 | if [[ "$CONFIGURATION" == "Release" ]]; then 58 | install_framework 'Pods-Redux_Tests/Redux.framework' 59 | fi 60 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Redux_Example/Pods-Redux_Example-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 5 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 6 | 7 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 8 | 9 | install_framework() 10 | { 11 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 12 | local source="${BUILT_PRODUCTS_DIR}/$1" 13 | else 14 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 15 | fi 16 | 17 | local destination="${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 18 | 19 | if [ -L "${source}" ]; then 20 | echo "Symlinked..." 21 | source="$(readlink "${source}")" 22 | fi 23 | 24 | # use filter instead of exclude so missing patterns dont' throw errors 25 | echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 26 | rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 27 | 28 | # Resign the code if required by the build settings to avoid unstable apps 29 | code_sign_if_enabled "${destination}/$(basename "$1")" 30 | 31 | # Embed linked Swift runtime libraries 32 | local basename 33 | basename="$(basename "$1" | sed -E s/\\..+// && exit ${PIPESTATUS[0]})" 34 | local swift_runtime_libs 35 | swift_runtime_libs=$(xcrun otool -LX "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/${basename}.framework/${basename}" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) 36 | for lib in $swift_runtime_libs; do 37 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 38 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 39 | code_sign_if_enabled "${destination}/${lib}" 40 | done 41 | } 42 | 43 | # Signs a framework with the provided identity 44 | code_sign_if_enabled() { 45 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 46 | # Use the current code_sign_identitiy 47 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 48 | echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements \"$1\"" 49 | /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} --preserve-metadata=identifier,entitlements "$1" 50 | fi 51 | } 52 | 53 | 54 | if [[ "$CONFIGURATION" == "Debug" ]]; then 55 | install_framework 'Pods-Redux_Example/Redux.framework' 56 | fi 57 | if [[ "$CONFIGURATION" == "Release" ]]; then 58 | install_framework 'Pods-Redux_Example/Redux.framework' 59 | fi 60 | -------------------------------------------------------------------------------- /Example/Redux/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // Redux 4 | // 5 | // Created by Steven-Chan on 01/04/2016. 6 | // Copyright (c) 2016 Oursky Limited. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import Redux 11 | 12 | class ViewController: UIViewController, StoreDelegate { 13 | 14 | @IBOutlet weak var textField: UITextField! 15 | @IBOutlet weak var tableView: UITableView! 16 | 17 | let dateFormatter = DateFormatter() 18 | 19 | var todoListData: [TodoListItem] = [TodoListItem]() { 20 | didSet { 21 | self.tableView.reloadData() 22 | } 23 | } 24 | 25 | override func viewDidLoad() { 26 | super.viewDidLoad() 27 | 28 | dateFormatter.dateStyle = DateFormatter.Style.long 29 | dateFormatter.timeStyle = .medium 30 | } 31 | 32 | override func viewWillAppear(_ animated: Bool) { 33 | super.viewWillAppear(animated) 34 | self.connect( 35 | Store.appStore, 36 | keys: [ kAppStateKeyTodoList ], 37 | delegate: self 38 | ) 39 | 40 | TodoListActionCreators.load( 41 | Store.appStore.dispatch, 42 | userDefaults: UserDefaults.standard 43 | ) 44 | } 45 | 46 | override func viewDidDisappear(_ animated: Bool) { 47 | super.viewDidDisappear(animated) 48 | self.disconnect(Store.appStore) 49 | } 50 | 51 | override func didReceiveMemoryWarning() { 52 | super.didReceiveMemoryWarning() 53 | // Dispose of any resources that can be recreated. 54 | } 55 | 56 | @IBAction func enterDidPress(_ sender: UIButton) { 57 | TodoListActionCreators.add( 58 | textField.text!, 59 | dispatch: Store.appStore.dispatch, 60 | userDefaults: UserDefaults.standard 61 | ) 62 | textField.text = "" 63 | } 64 | 65 | func storeDidUpdateState(_ lastState: ReduxAppState) { 66 | let lastTodoListState = 67 | lastState.get(kAppStateKeyTodoList) as! TodoListState 68 | 69 | if Store.appStore.getTodoListState()!.list != lastTodoListState.list { 70 | self.todoListData = Store.appStore.getTodoListState()!.list 71 | } 72 | } 73 | 74 | } 75 | 76 | extension ViewController: UITableViewDataSource { 77 | 78 | internal func tableView( 79 | _ tableView: UITableView, 80 | numberOfRowsInSection section: Int 81 | ) -> Int { 82 | return self.todoListData.count 83 | } 84 | 85 | internal func tableView( 86 | _ tableView: UITableView, 87 | cellForRowAt indexPath: IndexPath 88 | ) -> UITableViewCell { 89 | let cell = UITableViewCell( 90 | style: UITableViewCellStyle.subtitle, 91 | reuseIdentifier: "TodoListItem.cell" 92 | ) 93 | 94 | let item: TodoListItem? = self.todoListData[(indexPath as NSIndexPath).row] 95 | 96 | cell.textLabel?.text = item!.content 97 | cell.detailTextLabel?.text = 98 | dateFormatter.string(from: item!.createdAt! as Date) 99 | 100 | return cell 101 | } 102 | 103 | } 104 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Pods-Redux_Tests.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /Example/Tests/XCTestCase+ProgrammerAssertions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ProgrammerAssertions.swift 3 | // Redux 4 | // 5 | // Created by Steven Chan on 4/1/16. 6 | // Copyright © 2016 CocoaPods. All rights reserved. 7 | // 8 | import Foundation 9 | import XCTest 10 | @testable import Redux 11 | 12 | private let noReturnFailureWaitTime = 0.1 13 | 14 | // swiftlint:disable line_length 15 | public extension XCTestCase { 16 | 17 | /** 18 | Expects an `fatalError` to be called. 19 | If `fatalError` not called, the test case will fail. 20 | 21 | - parameter expectedMessage: The expected message to be asserted to the one passed to the `fatalError`. If nil, then ignored. 22 | - parameter file: The file name that called the method. 23 | - parameter line: The line number that called the method. 24 | - parameter testCase: The test case to be executed that expected to fire the assertion method. 25 | */ 26 | public func expectFatalError( 27 | _ expectedMessage: String? = nil, 28 | file: StaticString = #file, 29 | line: UInt = #line, 30 | testCase: @escaping () -> Void) { 31 | 32 | expectAssertionNoReturnFunction("fatalError", file: file, line: line, function: { (caller) -> () in 33 | 34 | Assertions.fatalErrorClosure = { message, _, _ in 35 | caller(message) 36 | } 37 | 38 | }, expectedMessage: expectedMessage, testCase: testCase) { () -> () in 39 | Assertions.fatalErrorClosure = Assertions.swiftFatalErrorClosure 40 | } 41 | } 42 | 43 | // MARK:- Private Methods 44 | fileprivate func expectAssertionNoReturnFunction( 45 | _ functionName: String, 46 | file: StaticString, 47 | line: UInt, 48 | function: (_ caller: @escaping (String) -> Never) -> Void, 49 | expectedMessage: String? = nil, 50 | testCase: @escaping () -> Void, 51 | cleanUp: @escaping () -> () 52 | ) { 53 | 54 | let expectation = self.expectation(description: functionName + "-Expectation") 55 | var assertionMessage: String? = nil 56 | 57 | function { (message) -> Never in 58 | assertionMessage = message 59 | expectation.fulfill() 60 | sleep(3600*5) 61 | Swift.fatalError(message) 62 | } 63 | 64 | // act, perform on separate thead because a call to function runs forever 65 | DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).async(execute: testCase) 66 | 67 | waitForExpectations(timeout: noReturnFailureWaitTime) { _ in 68 | 69 | defer { 70 | // clean up 71 | cleanUp() 72 | } 73 | 74 | guard let assertionMessage = assertionMessage else { 75 | XCTFail(functionName + " is expected to be called.", file: file, line: line) 76 | return 77 | } 78 | 79 | if let expectedMessage = expectedMessage { 80 | // assert only if not nil 81 | XCTAssertEqual(assertionMessage, expectedMessage, functionName + " called with incorrect message.", file: file, line: line) 82 | } 83 | } 84 | } 85 | } 86 | // swiftlint:enable line_length 87 | -------------------------------------------------------------------------------- /Example/Tests/Tests.swift: -------------------------------------------------------------------------------- 1 | import UIKit 2 | import XCTest 3 | import Redux 4 | 5 | /** 6 | 7 | Mock Counter 8 | 9 | **/ 10 | enum CounterAction: ReduxActionType { 11 | case decrement 12 | case increment 13 | case dispatchWithinDispatch(ReduxStore) 14 | } 15 | 16 | 17 | struct CounterState: AnyEquatable, Equatable { 18 | var count: Int 19 | } 20 | 21 | func == (lhs: CounterState, rhs: CounterState) -> Bool { 22 | return lhs.count == rhs.count 23 | } 24 | 25 | 26 | func counterReducer(_ previousState: Any, action: ReduxAction) -> Any { 27 | var counterState = previousState as! CounterState 28 | switch action.payload { 29 | case CounterAction.increment: 30 | counterState.count = counterState.count + 1 31 | break 32 | case CounterAction.decrement: 33 | counterState.count = counterState.count - 1 34 | break 35 | case CounterAction.dispatchWithinDispatch(let store): 36 | store.dispatch(ReduxAction(payload: CounterAction.increment)) 37 | break 38 | default: 39 | break 40 | } 41 | return counterState 42 | } 43 | 44 | 45 | 46 | /** 47 | 48 | Mock List 49 | 50 | **/ 51 | enum ListAction: ReduxActionType { 52 | case append(String) 53 | case remove 54 | } 55 | 56 | 57 | struct ListState: AnyEquatable, Equatable { 58 | var list: [String] 59 | } 60 | 61 | func == (lhs: ListState, rhs: ListState) -> Bool { 62 | return lhs.list == rhs.list 63 | } 64 | 65 | 66 | func listReducer(_ previousState: Any, action: ReduxAction) -> Any { 67 | var listState = previousState as! ListState 68 | switch action.payload { 69 | case ListAction.append(let str): 70 | listState.list.append(str) 71 | break 72 | case ListAction.remove: 73 | listState.list.removeLast() 74 | break 75 | default: 76 | break 77 | } 78 | return listState 79 | } 80 | 81 | 82 | 83 | /** 84 | 85 | Mock App 86 | 87 | **/ 88 | struct CombineState: ReduxAppState, AnyEquatable, Equatable { 89 | var count: CounterState 90 | var list: ListState 91 | 92 | func get(_ key: String) -> AnyEquatable? { 93 | switch key { 94 | case "count": return self.count 95 | case "list": return self.list 96 | default: return nil 97 | } 98 | } 99 | 100 | mutating func set(_ key: String, value: AnyEquatable) { 101 | switch key { 102 | case "count": 103 | self.count = value as! CounterState 104 | break 105 | case "list": 106 | self.list = value as! ListState 107 | break 108 | default: 109 | break 110 | } 111 | } 112 | } 113 | 114 | func == (lhs: CombineState, rhs: CombineState) -> Bool { 115 | return lhs.count == rhs.count && lhs.list == rhs.list 116 | } 117 | 118 | 119 | class Store: StoreType { 120 | 121 | static func configureStore() -> ReduxStore { 122 | 123 | let initialState = CombineState( 124 | count: CounterState(count: 0), 125 | list: ListState(list: [String]()) 126 | ) 127 | 128 | let reducers: [String: Reducer] = [ 129 | "count": counterReducer, 130 | "list": listReducer 131 | ] 132 | 133 | return createStore( 134 | combineReducers(reducers), 135 | initialState: initialState 136 | ) 137 | } 138 | 139 | } 140 | 141 | extension ReduxStore { 142 | 143 | func getCountState() -> CounterState? { 144 | return getAppState()!.get("count") as? CounterState 145 | } 146 | 147 | func getListState() -> ListState? { 148 | return getAppState()!.get("list") as? ListState 149 | } 150 | } 151 | -------------------------------------------------------------------------------- /Example/Redux/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 20 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /Example/Tests/ReducerTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ReducerTests.swift 3 | // SwiftRedux 4 | // 5 | // Created by Steven Chan on 30/12/15. 6 | // Copyright © 2015 CocoaPods. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | @testable import Redux 11 | 12 | class ReducerTests: XCTestCase { 13 | 14 | var counterInitialState: CounterState? 15 | var listInitialState: ListState? 16 | 17 | override func setUp() { 18 | super.setUp() 19 | 20 | counterInitialState = CounterState(count: 0) 21 | listInitialState = ListState(list: [String]()) 22 | } 23 | 24 | override func tearDown() { 25 | super.tearDown() 26 | } 27 | 28 | func testSingleReducer() { 29 | var nextState: Any = counterInitialState! 30 | nextState = counterReducer( 31 | nextState, 32 | action: ReduxAction(payload: CounterAction.increment) 33 | ) 34 | nextState = counterReducer( 35 | nextState, 36 | action: ReduxAction(payload: CounterAction.decrement) 37 | ) 38 | nextState = counterReducer( 39 | nextState, 40 | action: ReduxAction(payload: CounterAction.increment) 41 | ) 42 | 43 | let counterState: CounterState = nextState as! CounterState 44 | 45 | XCTAssert(counterState != counterInitialState) 46 | XCTAssert(counterState.count == 1) 47 | XCTAssert(counterInitialState!.count == 0) 48 | } 49 | 50 | func testCombineReducer() { 51 | 52 | let reducers: [String: Reducer] = [ 53 | "count": counterReducer, 54 | "list": listReducer 55 | ] 56 | 57 | let reducer: Reducer = combineReducers(reducers) 58 | 59 | let initialState = CombineState( 60 | count: CounterState(count: 0), 61 | list: ListState(list: [String]()) 62 | ) 63 | 64 | var nextState: Any = initialState 65 | 66 | nextState = reducer( 67 | nextState, 68 | ReduxAction(payload: CounterAction.increment) 69 | ) 70 | 71 | var counterState: CounterState = 72 | (nextState as! CombineState).get("count") as! CounterState 73 | var listState: ListState = 74 | (nextState as! CombineState).get("list") as! ListState 75 | 76 | XCTAssert(counterState.count == 1) 77 | XCTAssert(listState.list == [String]()) 78 | 79 | nextState = reducer( 80 | nextState, 81 | ReduxAction(payload: CounterAction.decrement) 82 | ) 83 | nextState = reducer( 84 | nextState, 85 | ReduxAction(payload: ListAction.append("Hi")) 86 | ) 87 | nextState = reducer( 88 | nextState, 89 | ReduxAction(payload: ListAction.append("Bye")) 90 | ) 91 | 92 | counterState = 93 | (nextState as! CombineState).get("count") as! CounterState 94 | listState = 95 | (nextState as! CombineState).get("list") as! ListState 96 | 97 | let oldListState = listState 98 | 99 | XCTAssert(counterState.count == 0) 100 | XCTAssert(listState.list == [ "Hi", "Bye" ]) 101 | XCTAssert(listState.list != [ "Hi", "Bye", "Oh what?" ]) 102 | 103 | nextState = reducer( 104 | nextState, 105 | ReduxAction(payload: ListAction.remove) 106 | ) 107 | nextState = reducer( 108 | nextState, 109 | ReduxAction(payload: ListAction.remove) 110 | ) 111 | 112 | counterState = 113 | (nextState as! CombineState).get("count") as! CounterState 114 | listState = 115 | (nextState as! CombineState).get("list") as! ListState 116 | 117 | XCTAssert(counterState.count == 0) 118 | XCTAssert(listState.list == [String]()) 119 | 120 | XCTAssert(oldListState.list == [ "Hi", "Bye" ]) 121 | } 122 | 123 | } 124 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Redux.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 31 | 32 | 34 | 40 | 41 | 42 | 43 | 44 | 50 | 51 | 52 | 53 | 54 | 55 | 65 | 66 | 72 | 73 | 74 | 75 | 76 | 77 | 83 | 84 | 90 | 91 | 92 | 93 | 95 | 96 | 99 | 100 | 101 | -------------------------------------------------------------------------------- /Example/Tests/StoreConnectorTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StoreConnectorTests.swift 3 | // SwiftRedux 4 | // 5 | // Created by Steven Chan on 30/12/15. 6 | // Copyright © 2015 CocoaPods. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | @testable import Redux 11 | import UIKit 12 | 13 | class MockViewController: UIViewController, StoreDelegate { 14 | 15 | var countLabelText: Int = 0 16 | var listData: [String] = [String]() 17 | 18 | var countChangeCount: Int = 0 19 | 20 | let store: ReduxStore 21 | init(store: ReduxStore) { 22 | self.store = store 23 | super.init(nibName: "", bundle: nil) 24 | } 25 | 26 | required init?(coder aDecoder: NSCoder) { 27 | Swift.fatalError("init(coder:) has not been implemented") 28 | } 29 | 30 | func connectRedux(_ store: ReduxStore, keys: [String]) { 31 | connect(store, keys: keys, delegate: self) 32 | } 33 | 34 | func disconnectRedux(_ store: ReduxStore) { 35 | disconnect(store) 36 | } 37 | 38 | func storeDidUpdateState(_ lastState: ReduxAppState) { 39 | let lastCountState = lastState.get("count") as! CounterState 40 | 41 | countLabelText = store.getCountState()!.count 42 | listData = store.getListState()!.list 43 | 44 | if lastCountState.count != store.getCountState()!.count { 45 | countChangeCount += 1 46 | } 47 | } 48 | 49 | } 50 | 51 | 52 | 53 | class StoreConnectorTests: XCTestCase { 54 | 55 | var viewController: MockViewController? 56 | var store: ReduxStore? 57 | 58 | override func setUp() { 59 | super.setUp() 60 | store = Store.configureStore() 61 | viewController = MockViewController(store: store!) 62 | } 63 | 64 | override func tearDown() { 65 | super.tearDown() 66 | } 67 | 68 | func testPositivePartialConnect() { 69 | viewController?.connectRedux(store!, keys: [ "count" ]) 70 | 71 | store?.dispatch(ReduxAction(payload: CounterAction.increment)) 72 | store?.dispatch(ReduxAction(payload: CounterAction.decrement)) 73 | store?.dispatch(ReduxAction(payload: CounterAction.increment)) 74 | 75 | XCTAssert(viewController?.countLabelText == 1) 76 | XCTAssert(viewController?.countChangeCount == 3) 77 | XCTAssert((viewController?.listData)! == [String]()) 78 | } 79 | 80 | func testNegativePartialConnect() { 81 | viewController?.connectRedux(store!, keys: [ "count" ]) 82 | 83 | store?.dispatch(ReduxAction(payload: ListAction.append("hi"))) 84 | store?.dispatch(ReduxAction(payload: ListAction.append("wah"))) 85 | 86 | XCTAssert(viewController?.countLabelText == 0) 87 | XCTAssert(viewController?.countChangeCount == 0) 88 | XCTAssert((viewController?.listData)! == [String]()) 89 | } 90 | 91 | func testAnotherNegativePartialConnect() { 92 | viewController?.connectRedux(store!, keys: [ "list" ]) 93 | 94 | store?.dispatch(ReduxAction(payload: ListAction.append("wah"))) 95 | store?.dispatch(ReduxAction(payload: CounterAction.increment)) 96 | 97 | XCTAssert(viewController?.countLabelText == 0) 98 | XCTAssert(viewController?.countChangeCount == 0) 99 | XCTAssert((viewController?.listData)! == [ "wah" ]) 100 | } 101 | 102 | func testCombineConnect() { 103 | viewController?.connectRedux(store!, keys: [ "list", "count" ]) 104 | 105 | store?.dispatch(ReduxAction(payload: ListAction.append("wah"))) 106 | store?.dispatch(ReduxAction(payload: CounterAction.increment)) 107 | 108 | XCTAssert(viewController?.countLabelText == 1) 109 | XCTAssert(viewController?.countChangeCount == 1) 110 | XCTAssert((viewController?.listData)! == [ "wah" ]) 111 | } 112 | 113 | func testDisconnect() { 114 | 115 | viewController?.connectRedux(store!, keys: [ "list", "count" ]) 116 | 117 | store?.dispatch(ReduxAction(payload: ListAction.append("wah"))) 118 | store?.dispatch(ReduxAction(payload: CounterAction.increment)) 119 | 120 | XCTAssert(viewController?.countLabelText == 1) 121 | XCTAssert(viewController?.countChangeCount == 1) 122 | XCTAssert((viewController?.listData)! == [ "wah" ]) 123 | 124 | viewController?.disconnect(store!) 125 | 126 | store?.dispatch(ReduxAction(payload: ListAction.append("wah"))) 127 | store?.dispatch(ReduxAction(payload: CounterAction.increment)) 128 | 129 | XCTAssert(viewController?.countLabelText == 1) 130 | XCTAssert(viewController?.countChangeCount == 1) 131 | XCTAssert((viewController?.listData)! == [ "wah" ]) 132 | } 133 | 134 | } 135 | -------------------------------------------------------------------------------- /Example/Redux.xcodeproj/xcshareddata/xcschemes/Redux-Example.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 67 | 68 | 78 | 80 | 86 | 87 | 88 | 89 | 90 | 91 | 97 | 99 | 105 | 106 | 107 | 108 | 110 | 111 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Redux_Tests/Pods-Redux_Tests-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 5 | 6 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 7 | > "$RESOURCES_TO_COPY" 8 | 9 | XCASSET_FILES=() 10 | 11 | realpath() { 12 | DIRECTORY="$(cd "${1%/*}" && pwd)" 13 | FILENAME="${1##*/}" 14 | echo "$DIRECTORY/$FILENAME" 15 | } 16 | 17 | install_resource() 18 | { 19 | case $1 in 20 | *.storyboard) 21 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}" 22 | ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" 23 | ;; 24 | *.xib) 25 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}" 26 | ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" 27 | ;; 28 | *.framework) 29 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 30 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 31 | echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 32 | rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 33 | ;; 34 | *.xcdatamodel) 35 | echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\"" 36 | xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom" 37 | ;; 38 | *.xcdatamodeld) 39 | echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\"" 40 | xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd" 41 | ;; 42 | *.xcmappingmodel) 43 | echo "xcrun mapc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm\"" 44 | xcrun mapc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm" 45 | ;; 46 | *.xcassets) 47 | ABSOLUTE_XCASSET_FILE=$(realpath "${PODS_ROOT}/$1") 48 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 49 | ;; 50 | /*) 51 | echo "$1" 52 | echo "$1" >> "$RESOURCES_TO_COPY" 53 | ;; 54 | *) 55 | echo "${PODS_ROOT}/$1" 56 | echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY" 57 | ;; 58 | esac 59 | } 60 | 61 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 62 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 63 | if [[ "${ACTION}" == "install" ]]; then 64 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 65 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 66 | fi 67 | rm -f "$RESOURCES_TO_COPY" 68 | 69 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] 70 | then 71 | case "${TARGETED_DEVICE_FAMILY}" in 72 | 1,2) 73 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 74 | ;; 75 | 1) 76 | TARGET_DEVICE_ARGS="--target-device iphone" 77 | ;; 78 | 2) 79 | TARGET_DEVICE_ARGS="--target-device ipad" 80 | ;; 81 | *) 82 | TARGET_DEVICE_ARGS="--target-device mac" 83 | ;; 84 | esac 85 | 86 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 87 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 88 | while read line; do 89 | if [[ $line != "`realpath $PODS_ROOT`*" ]]; then 90 | XCASSET_FILES+=("$line") 91 | fi 92 | done <<<"$OTHER_XCASSETS" 93 | 94 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 95 | fi 96 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Redux_Example/Pods-Redux_Example-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 5 | 6 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 7 | > "$RESOURCES_TO_COPY" 8 | 9 | XCASSET_FILES=() 10 | 11 | realpath() { 12 | DIRECTORY="$(cd "${1%/*}" && pwd)" 13 | FILENAME="${1##*/}" 14 | echo "$DIRECTORY/$FILENAME" 15 | } 16 | 17 | install_resource() 18 | { 19 | case $1 in 20 | *.storyboard) 21 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}" 22 | ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" 23 | ;; 24 | *.xib) 25 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}" 26 | ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" 27 | ;; 28 | *.framework) 29 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 30 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 31 | echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 32 | rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 33 | ;; 34 | *.xcdatamodel) 35 | echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\"" 36 | xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom" 37 | ;; 38 | *.xcdatamodeld) 39 | echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\"" 40 | xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd" 41 | ;; 42 | *.xcmappingmodel) 43 | echo "xcrun mapc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm\"" 44 | xcrun mapc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm" 45 | ;; 46 | *.xcassets) 47 | ABSOLUTE_XCASSET_FILE=$(realpath "${PODS_ROOT}/$1") 48 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") 49 | ;; 50 | /*) 51 | echo "$1" 52 | echo "$1" >> "$RESOURCES_TO_COPY" 53 | ;; 54 | *) 55 | echo "${PODS_ROOT}/$1" 56 | echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY" 57 | ;; 58 | esac 59 | } 60 | 61 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 62 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 63 | if [[ "${ACTION}" == "install" ]]; then 64 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 65 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 66 | fi 67 | rm -f "$RESOURCES_TO_COPY" 68 | 69 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] 70 | then 71 | case "${TARGETED_DEVICE_FAMILY}" in 72 | 1,2) 73 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 74 | ;; 75 | 1) 76 | TARGET_DEVICE_ARGS="--target-device iphone" 77 | ;; 78 | 2) 79 | TARGET_DEVICE_ARGS="--target-device ipad" 80 | ;; 81 | *) 82 | TARGET_DEVICE_ARGS="--target-device mac" 83 | ;; 84 | esac 85 | 86 | # Find all other xcassets (this unfortunately includes those of path pods and other targets). 87 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) 88 | while read line; do 89 | if [[ $line != "`realpath $PODS_ROOT`*" ]]; then 90 | XCASSET_FILES+=("$line") 91 | fi 92 | done <<<"$OTHER_XCASSETS" 93 | 94 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 95 | fi 96 | -------------------------------------------------------------------------------- /Example/Redux/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 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /Example/Redux.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; }; 11 | 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* ViewController.swift */; }; 12 | 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; }; 13 | 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDC1AFB9204008FA782 /* Images.xcassets */; }; 14 | 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; }; 15 | 958B2F784743EA04424A1AD8 /* Pods_Redux_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 69C80791CFDA5A86CADDD676 /* Pods_Redux_Example.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; 16 | A9057A141C3A5D9E00117DC8 /* XCTestCase+ProgrammerAssertions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9057A131C3A5D9E00117DC8 /* XCTestCase+ProgrammerAssertions.swift */; }; 17 | A963AE1C1C3A169000B36C50 /* AppState.swift in Sources */ = {isa = PBXBuildFile; fileRef = A963AE171C3A169000B36C50 /* AppState.swift */; }; 18 | A963AE1D1C3A169000B36C50 /* Store.swift in Sources */ = {isa = PBXBuildFile; fileRef = A963AE181C3A169000B36C50 /* Store.swift */; }; 19 | A963AE1E1C3A169000B36C50 /* TodoListAction.swift in Sources */ = {isa = PBXBuildFile; fileRef = A963AE191C3A169000B36C50 /* TodoListAction.swift */; }; 20 | A963AE1F1C3A169000B36C50 /* TodoListItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = A963AE1A1C3A169000B36C50 /* TodoListItem.swift */; }; 21 | A963AE201C3A169000B36C50 /* TodoListReducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A963AE1B1C3A169000B36C50 /* TodoListReducer.swift */; }; 22 | A963AE281C3A17AD00B36C50 /* ReducerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A963AE241C3A17AD00B36C50 /* ReducerTests.swift */; }; 23 | A963AE291C3A17AD00B36C50 /* StoreConnectorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A963AE251C3A17AD00B36C50 /* StoreConnectorTests.swift */; }; 24 | A963AE2A1C3A17AD00B36C50 /* StoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A963AE261C3A17AD00B36C50 /* StoreTests.swift */; }; 25 | A963AE2B1C3A17AD00B36C50 /* Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A963AE271C3A17AD00B36C50 /* Tests.swift */; }; 26 | A9A327A81C3B7F5900273622 /* MockDispatch.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9A327A71C3B7F5900273622 /* MockDispatch.swift */; }; 27 | A9A327AA1C3B7F7500273622 /* TodoListActionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9A327A91C3B7F7500273622 /* TodoListActionTests.swift */; }; 28 | CAF9A96E6EA96CCB741F00E1 /* Pods_Redux_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 601CC335698D6610D644D3B5 /* Pods_Redux_Tests.framework */; settings = {ATTRIBUTES = (Weak, ); }; }; 29 | /* End PBXBuildFile section */ 30 | 31 | /* Begin PBXContainerItemProxy section */ 32 | 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */ = { 33 | isa = PBXContainerItemProxy; 34 | containerPortal = 607FACC81AFB9204008FA782 /* Project object */; 35 | proxyType = 1; 36 | remoteGlobalIDString = 607FACCF1AFB9204008FA782; 37 | remoteInfo = Redux; 38 | }; 39 | /* End PBXContainerItemProxy section */ 40 | 41 | /* Begin PBXFileReference section */ 42 | 04851F26A9C2EFEF40B138BB /* Pods-Redux_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Redux_Example.release.xcconfig"; path = "Pods/Target Support Files/Pods-Redux_Example/Pods-Redux_Example.release.xcconfig"; sourceTree = ""; }; 43 | 601CC335698D6610D644D3B5 /* Pods_Redux_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Redux_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 44 | 607FACD01AFB9204008FA782 /* Redux_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Redux_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | 607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 46 | 607FACD51AFB9204008FA782 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 47 | 607FACD71AFB9204008FA782 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 48 | 607FACDA1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 49 | 607FACDC1AFB9204008FA782 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 50 | 607FACDF1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 51 | 607FACE51AFB9204008FA782 /* Redux_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Redux_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 52 | 607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 53 | 69C80791CFDA5A86CADDD676 /* Pods_Redux_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Redux_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 54 | 89C1C9F35B74376D73FAEE16 /* Pods-Redux_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Redux_Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-Redux_Tests/Pods-Redux_Tests.release.xcconfig"; sourceTree = ""; }; 55 | A509117D9AE7B98459DD9B12 /* Pods-Redux_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Redux_Example.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Redux_Example/Pods-Redux_Example.debug.xcconfig"; sourceTree = ""; }; 56 | A9057A131C3A5D9E00117DC8 /* XCTestCase+ProgrammerAssertions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "XCTestCase+ProgrammerAssertions.swift"; sourceTree = ""; }; 57 | A963AE171C3A169000B36C50 /* AppState.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppState.swift; sourceTree = ""; }; 58 | A963AE181C3A169000B36C50 /* Store.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Store.swift; sourceTree = ""; }; 59 | A963AE191C3A169000B36C50 /* TodoListAction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TodoListAction.swift; sourceTree = ""; }; 60 | A963AE1A1C3A169000B36C50 /* TodoListItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TodoListItem.swift; sourceTree = ""; }; 61 | A963AE1B1C3A169000B36C50 /* TodoListReducer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TodoListReducer.swift; sourceTree = ""; }; 62 | A963AE241C3A17AD00B36C50 /* ReducerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReducerTests.swift; sourceTree = ""; }; 63 | A963AE251C3A17AD00B36C50 /* StoreConnectorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoreConnectorTests.swift; sourceTree = ""; }; 64 | A963AE261C3A17AD00B36C50 /* StoreTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoreTests.swift; sourceTree = ""; }; 65 | A963AE271C3A17AD00B36C50 /* Tests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = ""; }; 66 | A9A327A71C3B7F5900273622 /* MockDispatch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockDispatch.swift; sourceTree = ""; }; 67 | A9A327A91C3B7F7500273622 /* TodoListActionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TodoListActionTests.swift; sourceTree = ""; }; 68 | D743464BE4D190B4D75EBD76 /* Pods-Redux_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Redux_Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Redux_Tests/Pods-Redux_Tests.debug.xcconfig"; sourceTree = ""; }; 69 | D9F28E9118CC65A6843AE734 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; 70 | E596E3907E35DBA6EA4A6C83 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 71 | EA4E927EF07B427B709FC715 /* Redux.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Redux.podspec; path = ../Redux.podspec; sourceTree = ""; }; 72 | /* End PBXFileReference section */ 73 | 74 | /* Begin PBXFrameworksBuildPhase section */ 75 | 607FACCD1AFB9204008FA782 /* Frameworks */ = { 76 | isa = PBXFrameworksBuildPhase; 77 | buildActionMask = 2147483647; 78 | files = ( 79 | 958B2F784743EA04424A1AD8 /* Pods_Redux_Example.framework in Frameworks */, 80 | ); 81 | runOnlyForDeploymentPostprocessing = 0; 82 | }; 83 | 607FACE21AFB9204008FA782 /* Frameworks */ = { 84 | isa = PBXFrameworksBuildPhase; 85 | buildActionMask = 2147483647; 86 | files = ( 87 | CAF9A96E6EA96CCB741F00E1 /* Pods_Redux_Tests.framework in Frameworks */, 88 | ); 89 | runOnlyForDeploymentPostprocessing = 0; 90 | }; 91 | /* End PBXFrameworksBuildPhase section */ 92 | 93 | /* Begin PBXGroup section */ 94 | 3578B062A46CFD41DB3EFB34 /* Pods */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | A509117D9AE7B98459DD9B12 /* Pods-Redux_Example.debug.xcconfig */, 98 | 04851F26A9C2EFEF40B138BB /* Pods-Redux_Example.release.xcconfig */, 99 | D743464BE4D190B4D75EBD76 /* Pods-Redux_Tests.debug.xcconfig */, 100 | 89C1C9F35B74376D73FAEE16 /* Pods-Redux_Tests.release.xcconfig */, 101 | ); 102 | name = Pods; 103 | sourceTree = ""; 104 | }; 105 | 607FACC71AFB9204008FA782 = { 106 | isa = PBXGroup; 107 | children = ( 108 | 607FACF51AFB993E008FA782 /* Podspec Metadata */, 109 | 607FACD21AFB9204008FA782 /* Example for Redux */, 110 | 607FACE81AFB9204008FA782 /* Tests */, 111 | 607FACD11AFB9204008FA782 /* Products */, 112 | 3578B062A46CFD41DB3EFB34 /* Pods */, 113 | BF9D0AE8E290AD4139B0B8B8 /* Frameworks */, 114 | ); 115 | sourceTree = ""; 116 | }; 117 | 607FACD11AFB9204008FA782 /* Products */ = { 118 | isa = PBXGroup; 119 | children = ( 120 | 607FACD01AFB9204008FA782 /* Redux_Example.app */, 121 | 607FACE51AFB9204008FA782 /* Redux_Tests.xctest */, 122 | ); 123 | name = Products; 124 | sourceTree = ""; 125 | }; 126 | 607FACD21AFB9204008FA782 /* Example for Redux */ = { 127 | isa = PBXGroup; 128 | children = ( 129 | A963AE211C3A169E00B36C50 /* Model */, 130 | A963AE221C3A16AE00B36C50 /* Action */, 131 | A963AE231C3A16B300B36C50 /* Reducer */, 132 | A963AE171C3A169000B36C50 /* AppState.swift */, 133 | A963AE181C3A169000B36C50 /* Store.swift */, 134 | 607FACD51AFB9204008FA782 /* AppDelegate.swift */, 135 | 607FACD71AFB9204008FA782 /* ViewController.swift */, 136 | 607FACD91AFB9204008FA782 /* Main.storyboard */, 137 | 607FACDC1AFB9204008FA782 /* Images.xcassets */, 138 | 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */, 139 | 607FACD31AFB9204008FA782 /* Supporting Files */, 140 | ); 141 | name = "Example for Redux"; 142 | path = Redux; 143 | sourceTree = ""; 144 | }; 145 | 607FACD31AFB9204008FA782 /* Supporting Files */ = { 146 | isa = PBXGroup; 147 | children = ( 148 | 607FACD41AFB9204008FA782 /* Info.plist */, 149 | ); 150 | name = "Supporting Files"; 151 | sourceTree = ""; 152 | }; 153 | 607FACE81AFB9204008FA782 /* Tests */ = { 154 | isa = PBXGroup; 155 | children = ( 156 | A963AE241C3A17AD00B36C50 /* ReducerTests.swift */, 157 | A963AE251C3A17AD00B36C50 /* StoreConnectorTests.swift */, 158 | A963AE261C3A17AD00B36C50 /* StoreTests.swift */, 159 | A963AE271C3A17AD00B36C50 /* Tests.swift */, 160 | A9057A131C3A5D9E00117DC8 /* XCTestCase+ProgrammerAssertions.swift */, 161 | A9A327A71C3B7F5900273622 /* MockDispatch.swift */, 162 | A9A327A91C3B7F7500273622 /* TodoListActionTests.swift */, 163 | 607FACE91AFB9204008FA782 /* Supporting Files */, 164 | ); 165 | path = Tests; 166 | sourceTree = ""; 167 | }; 168 | 607FACE91AFB9204008FA782 /* Supporting Files */ = { 169 | isa = PBXGroup; 170 | children = ( 171 | 607FACEA1AFB9204008FA782 /* Info.plist */, 172 | ); 173 | name = "Supporting Files"; 174 | sourceTree = ""; 175 | }; 176 | 607FACF51AFB993E008FA782 /* Podspec Metadata */ = { 177 | isa = PBXGroup; 178 | children = ( 179 | EA4E927EF07B427B709FC715 /* Redux.podspec */, 180 | E596E3907E35DBA6EA4A6C83 /* README.md */, 181 | D9F28E9118CC65A6843AE734 /* LICENSE */, 182 | ); 183 | name = "Podspec Metadata"; 184 | sourceTree = ""; 185 | }; 186 | A963AE211C3A169E00B36C50 /* Model */ = { 187 | isa = PBXGroup; 188 | children = ( 189 | A963AE1A1C3A169000B36C50 /* TodoListItem.swift */, 190 | ); 191 | name = Model; 192 | sourceTree = ""; 193 | }; 194 | A963AE221C3A16AE00B36C50 /* Action */ = { 195 | isa = PBXGroup; 196 | children = ( 197 | A963AE191C3A169000B36C50 /* TodoListAction.swift */, 198 | ); 199 | name = Action; 200 | sourceTree = ""; 201 | }; 202 | A963AE231C3A16B300B36C50 /* Reducer */ = { 203 | isa = PBXGroup; 204 | children = ( 205 | A963AE1B1C3A169000B36C50 /* TodoListReducer.swift */, 206 | ); 207 | name = Reducer; 208 | sourceTree = ""; 209 | }; 210 | BF9D0AE8E290AD4139B0B8B8 /* Frameworks */ = { 211 | isa = PBXGroup; 212 | children = ( 213 | 69C80791CFDA5A86CADDD676 /* Pods_Redux_Example.framework */, 214 | 601CC335698D6610D644D3B5 /* Pods_Redux_Tests.framework */, 215 | ); 216 | name = Frameworks; 217 | sourceTree = ""; 218 | }; 219 | /* End PBXGroup section */ 220 | 221 | /* Begin PBXNativeTarget section */ 222 | 607FACCF1AFB9204008FA782 /* Redux_Example */ = { 223 | isa = PBXNativeTarget; 224 | buildConfigurationList = 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "Redux_Example" */; 225 | buildPhases = ( 226 | DED0300BF30B1280083C24C0 /* Check Pods Manifest.lock */, 227 | 607FACCC1AFB9204008FA782 /* Sources */, 228 | 607FACCD1AFB9204008FA782 /* Frameworks */, 229 | 607FACCE1AFB9204008FA782 /* Resources */, 230 | 5A3E3D20B5E9A4E37EAD01B8 /* Embed Pods Frameworks */, 231 | 76496685E26487193BB84BCE /* Copy Pods Resources */, 232 | ); 233 | buildRules = ( 234 | ); 235 | dependencies = ( 236 | ); 237 | name = Redux_Example; 238 | productName = Redux; 239 | productReference = 607FACD01AFB9204008FA782 /* Redux_Example.app */; 240 | productType = "com.apple.product-type.application"; 241 | }; 242 | 607FACE41AFB9204008FA782 /* Redux_Tests */ = { 243 | isa = PBXNativeTarget; 244 | buildConfigurationList = 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "Redux_Tests" */; 245 | buildPhases = ( 246 | 08D249CEE5290C5B38B9B40D /* Check Pods Manifest.lock */, 247 | 607FACE11AFB9204008FA782 /* Sources */, 248 | 607FACE21AFB9204008FA782 /* Frameworks */, 249 | 607FACE31AFB9204008FA782 /* Resources */, 250 | 83924BA9EDE31AD377BDC113 /* Embed Pods Frameworks */, 251 | 871ADC22303DBC9D3FED0F03 /* Copy Pods Resources */, 252 | ); 253 | buildRules = ( 254 | ); 255 | dependencies = ( 256 | 607FACE71AFB9204008FA782 /* PBXTargetDependency */, 257 | ); 258 | name = Redux_Tests; 259 | productName = Tests; 260 | productReference = 607FACE51AFB9204008FA782 /* Redux_Tests.xctest */; 261 | productType = "com.apple.product-type.bundle.unit-test"; 262 | }; 263 | /* End PBXNativeTarget section */ 264 | 265 | /* Begin PBXProject section */ 266 | 607FACC81AFB9204008FA782 /* Project object */ = { 267 | isa = PBXProject; 268 | attributes = { 269 | LastSwiftUpdateCheck = 0700; 270 | LastUpgradeCheck = 0800; 271 | ORGANIZATIONNAME = CocoaPods; 272 | TargetAttributes = { 273 | 607FACCF1AFB9204008FA782 = { 274 | CreatedOnToolsVersion = 6.3.1; 275 | LastSwiftMigration = 0800; 276 | }; 277 | 607FACE41AFB9204008FA782 = { 278 | CreatedOnToolsVersion = 6.3.1; 279 | LastSwiftMigration = 0800; 280 | TestTargetID = 607FACCF1AFB9204008FA782; 281 | }; 282 | }; 283 | }; 284 | buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "Redux" */; 285 | compatibilityVersion = "Xcode 3.2"; 286 | developmentRegion = English; 287 | hasScannedForEncodings = 0; 288 | knownRegions = ( 289 | en, 290 | Base, 291 | ); 292 | mainGroup = 607FACC71AFB9204008FA782; 293 | productRefGroup = 607FACD11AFB9204008FA782 /* Products */; 294 | projectDirPath = ""; 295 | projectRoot = ""; 296 | targets = ( 297 | 607FACCF1AFB9204008FA782 /* Redux_Example */, 298 | 607FACE41AFB9204008FA782 /* Redux_Tests */, 299 | ); 300 | }; 301 | /* End PBXProject section */ 302 | 303 | /* Begin PBXResourcesBuildPhase section */ 304 | 607FACCE1AFB9204008FA782 /* Resources */ = { 305 | isa = PBXResourcesBuildPhase; 306 | buildActionMask = 2147483647; 307 | files = ( 308 | 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */, 309 | 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */, 310 | 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */, 311 | ); 312 | runOnlyForDeploymentPostprocessing = 0; 313 | }; 314 | 607FACE31AFB9204008FA782 /* Resources */ = { 315 | isa = PBXResourcesBuildPhase; 316 | buildActionMask = 2147483647; 317 | files = ( 318 | ); 319 | runOnlyForDeploymentPostprocessing = 0; 320 | }; 321 | /* End PBXResourcesBuildPhase section */ 322 | 323 | /* Begin PBXShellScriptBuildPhase section */ 324 | 08D249CEE5290C5B38B9B40D /* Check Pods Manifest.lock */ = { 325 | isa = PBXShellScriptBuildPhase; 326 | buildActionMask = 2147483647; 327 | files = ( 328 | ); 329 | inputPaths = ( 330 | ); 331 | name = "Check Pods Manifest.lock"; 332 | outputPaths = ( 333 | ); 334 | runOnlyForDeploymentPostprocessing = 0; 335 | shellPath = /bin/sh; 336 | shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; 337 | showEnvVarsInLog = 0; 338 | }; 339 | 5A3E3D20B5E9A4E37EAD01B8 /* Embed Pods Frameworks */ = { 340 | isa = PBXShellScriptBuildPhase; 341 | buildActionMask = 2147483647; 342 | files = ( 343 | ); 344 | inputPaths = ( 345 | ); 346 | name = "Embed Pods Frameworks"; 347 | outputPaths = ( 348 | ); 349 | runOnlyForDeploymentPostprocessing = 0; 350 | shellPath = /bin/sh; 351 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Redux_Example/Pods-Redux_Example-frameworks.sh\"\n"; 352 | showEnvVarsInLog = 0; 353 | }; 354 | 76496685E26487193BB84BCE /* Copy Pods Resources */ = { 355 | isa = PBXShellScriptBuildPhase; 356 | buildActionMask = 2147483647; 357 | files = ( 358 | ); 359 | inputPaths = ( 360 | ); 361 | name = "Copy Pods Resources"; 362 | outputPaths = ( 363 | ); 364 | runOnlyForDeploymentPostprocessing = 0; 365 | shellPath = /bin/sh; 366 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Redux_Example/Pods-Redux_Example-resources.sh\"\n"; 367 | showEnvVarsInLog = 0; 368 | }; 369 | 83924BA9EDE31AD377BDC113 /* Embed Pods Frameworks */ = { 370 | isa = PBXShellScriptBuildPhase; 371 | buildActionMask = 2147483647; 372 | files = ( 373 | ); 374 | inputPaths = ( 375 | ); 376 | name = "Embed Pods Frameworks"; 377 | outputPaths = ( 378 | ); 379 | runOnlyForDeploymentPostprocessing = 0; 380 | shellPath = /bin/sh; 381 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Redux_Tests/Pods-Redux_Tests-frameworks.sh\"\n"; 382 | showEnvVarsInLog = 0; 383 | }; 384 | 871ADC22303DBC9D3FED0F03 /* Copy Pods Resources */ = { 385 | isa = PBXShellScriptBuildPhase; 386 | buildActionMask = 2147483647; 387 | files = ( 388 | ); 389 | inputPaths = ( 390 | ); 391 | name = "Copy Pods Resources"; 392 | outputPaths = ( 393 | ); 394 | runOnlyForDeploymentPostprocessing = 0; 395 | shellPath = /bin/sh; 396 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Redux_Tests/Pods-Redux_Tests-resources.sh\"\n"; 397 | showEnvVarsInLog = 0; 398 | }; 399 | DED0300BF30B1280083C24C0 /* Check Pods Manifest.lock */ = { 400 | isa = PBXShellScriptBuildPhase; 401 | buildActionMask = 2147483647; 402 | files = ( 403 | ); 404 | inputPaths = ( 405 | ); 406 | name = "Check Pods Manifest.lock"; 407 | outputPaths = ( 408 | ); 409 | runOnlyForDeploymentPostprocessing = 0; 410 | shellPath = /bin/sh; 411 | shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; 412 | showEnvVarsInLog = 0; 413 | }; 414 | /* End PBXShellScriptBuildPhase section */ 415 | 416 | /* Begin PBXSourcesBuildPhase section */ 417 | 607FACCC1AFB9204008FA782 /* Sources */ = { 418 | isa = PBXSourcesBuildPhase; 419 | buildActionMask = 2147483647; 420 | files = ( 421 | A963AE1F1C3A169000B36C50 /* TodoListItem.swift in Sources */, 422 | A963AE1C1C3A169000B36C50 /* AppState.swift in Sources */, 423 | 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */, 424 | 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */, 425 | A963AE1E1C3A169000B36C50 /* TodoListAction.swift in Sources */, 426 | A963AE1D1C3A169000B36C50 /* Store.swift in Sources */, 427 | A963AE201C3A169000B36C50 /* TodoListReducer.swift in Sources */, 428 | ); 429 | runOnlyForDeploymentPostprocessing = 0; 430 | }; 431 | 607FACE11AFB9204008FA782 /* Sources */ = { 432 | isa = PBXSourcesBuildPhase; 433 | buildActionMask = 2147483647; 434 | files = ( 435 | A963AE281C3A17AD00B36C50 /* ReducerTests.swift in Sources */, 436 | A9057A141C3A5D9E00117DC8 /* XCTestCase+ProgrammerAssertions.swift in Sources */, 437 | A9A327AA1C3B7F7500273622 /* TodoListActionTests.swift in Sources */, 438 | A963AE2B1C3A17AD00B36C50 /* Tests.swift in Sources */, 439 | A963AE291C3A17AD00B36C50 /* StoreConnectorTests.swift in Sources */, 440 | A9A327A81C3B7F5900273622 /* MockDispatch.swift in Sources */, 441 | A963AE2A1C3A17AD00B36C50 /* StoreTests.swift in Sources */, 442 | ); 443 | runOnlyForDeploymentPostprocessing = 0; 444 | }; 445 | /* End PBXSourcesBuildPhase section */ 446 | 447 | /* Begin PBXTargetDependency section */ 448 | 607FACE71AFB9204008FA782 /* PBXTargetDependency */ = { 449 | isa = PBXTargetDependency; 450 | target = 607FACCF1AFB9204008FA782 /* Redux_Example */; 451 | targetProxy = 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */; 452 | }; 453 | /* End PBXTargetDependency section */ 454 | 455 | /* Begin PBXVariantGroup section */ 456 | 607FACD91AFB9204008FA782 /* Main.storyboard */ = { 457 | isa = PBXVariantGroup; 458 | children = ( 459 | 607FACDA1AFB9204008FA782 /* Base */, 460 | ); 461 | name = Main.storyboard; 462 | sourceTree = ""; 463 | }; 464 | 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */ = { 465 | isa = PBXVariantGroup; 466 | children = ( 467 | 607FACDF1AFB9204008FA782 /* Base */, 468 | ); 469 | name = LaunchScreen.xib; 470 | sourceTree = ""; 471 | }; 472 | /* End PBXVariantGroup section */ 473 | 474 | /* Begin XCBuildConfiguration section */ 475 | 607FACED1AFB9204008FA782 /* Debug */ = { 476 | isa = XCBuildConfiguration; 477 | buildSettings = { 478 | ALWAYS_SEARCH_USER_PATHS = NO; 479 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 480 | CLANG_CXX_LIBRARY = "libc++"; 481 | CLANG_ENABLE_MODULES = YES; 482 | CLANG_ENABLE_OBJC_ARC = YES; 483 | CLANG_WARN_BOOL_CONVERSION = YES; 484 | CLANG_WARN_CONSTANT_CONVERSION = YES; 485 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 486 | CLANG_WARN_EMPTY_BODY = YES; 487 | CLANG_WARN_ENUM_CONVERSION = YES; 488 | CLANG_WARN_INFINITE_RECURSION = YES; 489 | CLANG_WARN_INT_CONVERSION = YES; 490 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 491 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 492 | CLANG_WARN_UNREACHABLE_CODE = YES; 493 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 494 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 495 | COPY_PHASE_STRIP = NO; 496 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 497 | ENABLE_STRICT_OBJC_MSGSEND = YES; 498 | ENABLE_TESTABILITY = YES; 499 | GCC_C_LANGUAGE_STANDARD = gnu99; 500 | GCC_DYNAMIC_NO_PIC = NO; 501 | GCC_NO_COMMON_BLOCKS = YES; 502 | GCC_OPTIMIZATION_LEVEL = 0; 503 | GCC_PREPROCESSOR_DEFINITIONS = ( 504 | "DEBUG=1", 505 | "$(inherited)", 506 | ); 507 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 508 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 509 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 510 | GCC_WARN_UNDECLARED_SELECTOR = YES; 511 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 512 | GCC_WARN_UNUSED_FUNCTION = YES; 513 | GCC_WARN_UNUSED_VARIABLE = YES; 514 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 515 | MTL_ENABLE_DEBUG_INFO = YES; 516 | ONLY_ACTIVE_ARCH = YES; 517 | SDKROOT = iphoneos; 518 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 519 | }; 520 | name = Debug; 521 | }; 522 | 607FACEE1AFB9204008FA782 /* Release */ = { 523 | isa = XCBuildConfiguration; 524 | buildSettings = { 525 | ALWAYS_SEARCH_USER_PATHS = NO; 526 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 527 | CLANG_CXX_LIBRARY = "libc++"; 528 | CLANG_ENABLE_MODULES = YES; 529 | CLANG_ENABLE_OBJC_ARC = YES; 530 | CLANG_WARN_BOOL_CONVERSION = YES; 531 | CLANG_WARN_CONSTANT_CONVERSION = YES; 532 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 533 | CLANG_WARN_EMPTY_BODY = YES; 534 | CLANG_WARN_ENUM_CONVERSION = YES; 535 | CLANG_WARN_INFINITE_RECURSION = YES; 536 | CLANG_WARN_INT_CONVERSION = YES; 537 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 538 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 539 | CLANG_WARN_UNREACHABLE_CODE = YES; 540 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 541 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 542 | COPY_PHASE_STRIP = NO; 543 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 544 | ENABLE_NS_ASSERTIONS = NO; 545 | ENABLE_STRICT_OBJC_MSGSEND = YES; 546 | GCC_C_LANGUAGE_STANDARD = gnu99; 547 | GCC_NO_COMMON_BLOCKS = YES; 548 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 549 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 550 | GCC_WARN_UNDECLARED_SELECTOR = YES; 551 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 552 | GCC_WARN_UNUSED_FUNCTION = YES; 553 | GCC_WARN_UNUSED_VARIABLE = YES; 554 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 555 | MTL_ENABLE_DEBUG_INFO = NO; 556 | SDKROOT = iphoneos; 557 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 558 | VALIDATE_PRODUCT = YES; 559 | }; 560 | name = Release; 561 | }; 562 | 607FACF01AFB9204008FA782 /* Debug */ = { 563 | isa = XCBuildConfiguration; 564 | baseConfigurationReference = A509117D9AE7B98459DD9B12 /* Pods-Redux_Example.debug.xcconfig */; 565 | buildSettings = { 566 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 567 | INFOPLIST_FILE = Redux/Info.plist; 568 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 569 | MODULE_NAME = ExampleApp; 570 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; 571 | PRODUCT_NAME = "$(TARGET_NAME)"; 572 | SWIFT_VERSION = 3.0; 573 | }; 574 | name = Debug; 575 | }; 576 | 607FACF11AFB9204008FA782 /* Release */ = { 577 | isa = XCBuildConfiguration; 578 | baseConfigurationReference = 04851F26A9C2EFEF40B138BB /* Pods-Redux_Example.release.xcconfig */; 579 | buildSettings = { 580 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 581 | INFOPLIST_FILE = Redux/Info.plist; 582 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 583 | MODULE_NAME = ExampleApp; 584 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; 585 | PRODUCT_NAME = "$(TARGET_NAME)"; 586 | SWIFT_VERSION = 3.0; 587 | }; 588 | name = Release; 589 | }; 590 | 607FACF31AFB9204008FA782 /* Debug */ = { 591 | isa = XCBuildConfiguration; 592 | baseConfigurationReference = D743464BE4D190B4D75EBD76 /* Pods-Redux_Tests.debug.xcconfig */; 593 | buildSettings = { 594 | BUNDLE_LOADER = "$(TEST_HOST)"; 595 | CLANG_ENABLE_MODULES = YES; 596 | GCC_PREPROCESSOR_DEFINITIONS = ( 597 | "DEBUG=1", 598 | "$(inherited)", 599 | ); 600 | INFOPLIST_FILE = Tests/Info.plist; 601 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 602 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; 603 | PRODUCT_NAME = "$(TARGET_NAME)"; 604 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 605 | SWIFT_VERSION = 3.0; 606 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Redux_Example.app/Redux_Example"; 607 | }; 608 | name = Debug; 609 | }; 610 | 607FACF41AFB9204008FA782 /* Release */ = { 611 | isa = XCBuildConfiguration; 612 | baseConfigurationReference = 89C1C9F35B74376D73FAEE16 /* Pods-Redux_Tests.release.xcconfig */; 613 | buildSettings = { 614 | BUNDLE_LOADER = "$(TEST_HOST)"; 615 | CLANG_ENABLE_MODULES = YES; 616 | INFOPLIST_FILE = Tests/Info.plist; 617 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 618 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; 619 | PRODUCT_NAME = "$(TARGET_NAME)"; 620 | SWIFT_VERSION = 3.0; 621 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Redux_Example.app/Redux_Example"; 622 | }; 623 | name = Release; 624 | }; 625 | /* End XCBuildConfiguration section */ 626 | 627 | /* Begin XCConfigurationList section */ 628 | 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "Redux" */ = { 629 | isa = XCConfigurationList; 630 | buildConfigurations = ( 631 | 607FACED1AFB9204008FA782 /* Debug */, 632 | 607FACEE1AFB9204008FA782 /* Release */, 633 | ); 634 | defaultConfigurationIsVisible = 0; 635 | defaultConfigurationName = Release; 636 | }; 637 | 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "Redux_Example" */ = { 638 | isa = XCConfigurationList; 639 | buildConfigurations = ( 640 | 607FACF01AFB9204008FA782 /* Debug */, 641 | 607FACF11AFB9204008FA782 /* Release */, 642 | ); 643 | defaultConfigurationIsVisible = 0; 644 | defaultConfigurationName = Release; 645 | }; 646 | 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "Redux_Tests" */ = { 647 | isa = XCConfigurationList; 648 | buildConfigurations = ( 649 | 607FACF31AFB9204008FA782 /* Debug */, 650 | 607FACF41AFB9204008FA782 /* Release */, 651 | ); 652 | defaultConfigurationIsVisible = 0; 653 | defaultConfigurationName = Release; 654 | }; 655 | /* End XCConfigurationList section */ 656 | }; 657 | rootObject = 607FACC81AFB9204008FA782 /* Project object */; 658 | } 659 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 08A847CBFB33DCFA9A74CEC0CDB78AAA /* Redux.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 3C40063DEF4593C496EE5CF5674F8F93 /* Redux.bundle */; }; 11 | 20C55F425C226AEC97E69218102AFA42 /* StoreConnector.swift in Sources */ = {isa = PBXBuildFile; fileRef = CD60894839D3E208E8B5C4CA266C043B /* StoreConnector.swift */; }; 12 | 497B3BAB1A84CCC82C4D5CCAA819B00E /* Pods-Redux_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 620224777D2803421BBE626D712B61DB /* Pods-Redux_Example-dummy.m */; }; 13 | 526FFA82A8745C3EC116188A9F55C5C9 /* types.swift in Sources */ = {isa = PBXBuildFile; fileRef = 896340A6ABB199ACDF644929F5C87397 /* types.swift */; }; 14 | 575336A36E28B519FC00231218CC20A8 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D863289C844AF0D209344DE88E750E22 /* Foundation.framework */; }; 15 | 5AD39CC02C5FA477BC67CE4E54E25C41 /* Pods-Redux_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 03E876BB17B7FEB86B6C4BA3386EBFFB /* Pods-Redux_Tests-dummy.m */; }; 16 | 66278D7683FC7C8484F8992F2CCC5E6A /* StoreType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B346F610580C8AE3AEAC0F67A662BEB /* StoreType.swift */; }; 17 | 7224614E4DAA346FBABD39ED675B3B23 /* ProgrammerAssertions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 752DB45A57D480B878FDCB584F94E38D /* ProgrammerAssertions.swift */; }; 18 | 833CF28B196B47770B3DEFB092A8B71A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D863289C844AF0D209344DE88E750E22 /* Foundation.framework */; }; 19 | 9BDC434EDEF46D505DDFB2DC6FBDD3D8 /* combineReducers.swift in Sources */ = {isa = PBXBuildFile; fileRef = F612B93E916A1770FB4E441C8A4E94E6 /* combineReducers.swift */; }; 20 | B2E0DE5B4CC124926DC0DA76D08B1A8B /* Pods-Redux_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = BB2E9333CE5022BD96D88CDBF45A1435 /* Pods-Redux_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 21 | B9D0F90A51534C585FE372811F4B0DD4 /* Redux-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 11736635A3DC7E3DCF1DCED9D62F1FE9 /* Redux-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 22 | D089038B20E9798971F555D2D3313522 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D863289C844AF0D209344DE88E750E22 /* Foundation.framework */; }; 23 | E4C45EA868933D574C479816D9D81F34 /* Redux-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7F69CAB7A6B9FB6800709A471FE7788D /* Redux-dummy.m */; }; 24 | F42C35EE3D3A49C5E40528DA47C18FD0 /* Pods-Redux_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7446989795D4076656DBD009F87138B0 /* Pods-Redux_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 25 | F97F82CCB3608733BBBFA193F2DC6DD3 /* createStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29533103537E6969C19046472D05B4D4 /* createStore.swift */; }; 26 | /* End PBXBuildFile section */ 27 | 28 | /* Begin PBXContainerItemProxy section */ 29 | 192577B3E84357CB973643EE69D413C7 /* PBXContainerItemProxy */ = { 30 | isa = PBXContainerItemProxy; 31 | containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 32 | proxyType = 1; 33 | remoteGlobalIDString = 83B5480CD64EEE70EC1B86FE9E9B4F29; 34 | remoteInfo = Redux; 35 | }; 36 | C55F840917032CB545FD25CDDC092012 /* PBXContainerItemProxy */ = { 37 | isa = PBXContainerItemProxy; 38 | containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 39 | proxyType = 1; 40 | remoteGlobalIDString = 83B5480CD64EEE70EC1B86FE9E9B4F29; 41 | remoteInfo = Redux; 42 | }; 43 | F9732E9BCE5219758902130465B65532 /* PBXContainerItemProxy */ = { 44 | isa = PBXContainerItemProxy; 45 | containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 46 | proxyType = 1; 47 | remoteGlobalIDString = 8052ADE55F1B8B9FA6DECBCA97AF2455; 48 | remoteInfo = "Redux-Redux"; 49 | }; 50 | /* End PBXContainerItemProxy section */ 51 | 52 | /* Begin PBXFileReference section */ 53 | 03E876BB17B7FEB86B6C4BA3386EBFFB /* Pods-Redux_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Redux_Tests-dummy.m"; sourceTree = ""; }; 54 | 11736635A3DC7E3DCF1DCED9D62F1FE9 /* Redux-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Redux-umbrella.h"; sourceTree = ""; }; 55 | 19F34E897D8E929D5E70E5F0472E1DBB /* Pods-Redux_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Redux_Example-acknowledgements.markdown"; sourceTree = ""; }; 56 | 1E42A10BB003504F34EBFFFA5A188991 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 57 | 268EE0A2B991BD87F83D140C272A5D15 /* Pods-Redux_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Redux_Example.debug.xcconfig"; sourceTree = ""; }; 58 | 2886449C968D0A3B6E334A3C468AF212 /* Pods-Redux_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Redux_Tests.release.xcconfig"; sourceTree = ""; }; 59 | 29533103537E6969C19046472D05B4D4 /* createStore.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = createStore.swift; sourceTree = ""; }; 60 | 37853880232253B735AA0AF8478511AD /* Pods-Redux_Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Redux_Tests-frameworks.sh"; sourceTree = ""; }; 61 | 3C40063DEF4593C496EE5CF5674F8F93 /* Redux.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Redux.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 62 | 4517B98C88107A2A3CEAA131B4654BD8 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 63 | 5B346F610580C8AE3AEAC0F67A662BEB /* StoreType.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = StoreType.swift; sourceTree = ""; }; 64 | 5F848A9499195CCF4538AE2E8385378E /* Pods_Redux_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Redux_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 65 | 620224777D2803421BBE626D712B61DB /* Pods-Redux_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Redux_Example-dummy.m"; sourceTree = ""; }; 66 | 6AA3BC4A8856CAC0BF349A2D670720B5 /* Pods_Redux_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Redux_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 67 | 72F3D738A63021DDA4333EFA9B877474 /* Pods-Redux_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Redux_Tests-acknowledgements.plist"; sourceTree = ""; }; 68 | 7446989795D4076656DBD009F87138B0 /* Pods-Redux_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Redux_Tests-umbrella.h"; sourceTree = ""; }; 69 | 752DB45A57D480B878FDCB584F94E38D /* ProgrammerAssertions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ProgrammerAssertions.swift; sourceTree = ""; }; 70 | 768B21DC09171AAB95C64BD22F694C70 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 71 | 7A8F9FDA96F44435B18C6F18CC16B631 /* Pods-Redux_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Redux_Tests-acknowledgements.markdown"; sourceTree = ""; }; 72 | 7C795B754B90E9FFA838D1F36DA9DDB6 /* Redux.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Redux.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 73 | 7D88C7B858532831D0DC5A38F4EA6CCE /* Redux-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Redux-prefix.pch"; sourceTree = ""; }; 74 | 7F161FC562A1ACB1D39F9884556FB405 /* Redux.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Redux.modulemap; sourceTree = ""; }; 75 | 7F69CAB7A6B9FB6800709A471FE7788D /* Redux-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Redux-dummy.m"; sourceTree = ""; }; 76 | 86183FB97D3024C7D062FF6FBBDF9E7B /* Pods-Redux_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-Redux_Example.modulemap"; sourceTree = ""; }; 77 | 896340A6ABB199ACDF644929F5C87397 /* types.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = types.swift; sourceTree = ""; }; 78 | 8B5A020BE249981652D971254A185E19 /* Pods-Redux_Tests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Redux_Tests-resources.sh"; sourceTree = ""; }; 79 | 912DDCCE9AAAAF7AA2BF2D7648BE4737 /* Redux.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Redux.xcconfig; sourceTree = ""; }; 80 | B0D3C400AB7466AC6ADC219CF0C114E0 /* Pods-Redux_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "Pods-Redux_Tests.modulemap"; sourceTree = ""; }; 81 | BA6428E9F66FD5A23C0A2E06ED26CD2F /* Podfile */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 82 | BB2E9333CE5022BD96D88CDBF45A1435 /* Pods-Redux_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Redux_Example-umbrella.h"; sourceTree = ""; }; 83 | C6D1E74C2CCB36DA9FD48C08918A8F73 /* Pods-Redux_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Redux_Example-acknowledgements.plist"; sourceTree = ""; }; 84 | CABBB3613E0E8A5BE57FF9C168AB24BA /* Pods-Redux_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Redux_Tests.debug.xcconfig"; sourceTree = ""; }; 85 | CD60894839D3E208E8B5C4CA266C043B /* StoreConnector.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = StoreConnector.swift; sourceTree = ""; }; 86 | D716D774DEC118B5401C58822364A815 /* Pods-Redux_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Redux_Example-frameworks.sh"; sourceTree = ""; }; 87 | D863289C844AF0D209344DE88E750E22 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 88 | E99DFCAB071609C711CF047EC18477F8 /* Redux-Private.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Redux-Private.xcconfig"; sourceTree = ""; }; 89 | EB4F558CF8B834FB911D9C1EE06BDE51 /* Pods-Redux_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Redux_Example.release.xcconfig"; sourceTree = ""; }; 90 | EC1EB038E600F733FFD9E82219C517C1 /* Pods-Redux_Example-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Redux_Example-resources.sh"; sourceTree = ""; }; 91 | F612B93E916A1770FB4E441C8A4E94E6 /* combineReducers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = combineReducers.swift; sourceTree = ""; }; 92 | /* End PBXFileReference section */ 93 | 94 | /* Begin PBXFrameworksBuildPhase section */ 95 | 190AA2AAED602944D8BA84F07414A15B /* Frameworks */ = { 96 | isa = PBXFrameworksBuildPhase; 97 | buildActionMask = 2147483647; 98 | files = ( 99 | ); 100 | runOnlyForDeploymentPostprocessing = 0; 101 | }; 102 | 20548FF161627E53A472B8DE9139B766 /* Frameworks */ = { 103 | isa = PBXFrameworksBuildPhase; 104 | buildActionMask = 2147483647; 105 | files = ( 106 | D089038B20E9798971F555D2D3313522 /* Foundation.framework in Frameworks */, 107 | ); 108 | runOnlyForDeploymentPostprocessing = 0; 109 | }; 110 | 3AE8F67260C03BF8D036A22FE1036A3E /* Frameworks */ = { 111 | isa = PBXFrameworksBuildPhase; 112 | buildActionMask = 2147483647; 113 | files = ( 114 | 833CF28B196B47770B3DEFB092A8B71A /* Foundation.framework in Frameworks */, 115 | ); 116 | runOnlyForDeploymentPostprocessing = 0; 117 | }; 118 | A8A22059F8EBED9CFA757E2FDD281496 /* Frameworks */ = { 119 | isa = PBXFrameworksBuildPhase; 120 | buildActionMask = 2147483647; 121 | files = ( 122 | 575336A36E28B519FC00231218CC20A8 /* Foundation.framework in Frameworks */, 123 | ); 124 | runOnlyForDeploymentPostprocessing = 0; 125 | }; 126 | /* End PBXFrameworksBuildPhase section */ 127 | 128 | /* Begin PBXGroup section */ 129 | 006341184BE14D77404CBD84F83BDA1F /* Classes */ = { 130 | isa = PBXGroup; 131 | children = ( 132 | 752DB45A57D480B878FDCB584F94E38D /* ProgrammerAssertions.swift */, 133 | CD60894839D3E208E8B5C4CA266C043B /* StoreConnector.swift */, 134 | 5B346F610580C8AE3AEAC0F67A662BEB /* StoreType.swift */, 135 | F612B93E916A1770FB4E441C8A4E94E6 /* combineReducers.swift */, 136 | 29533103537E6969C19046472D05B4D4 /* createStore.swift */, 137 | 896340A6ABB199ACDF644929F5C87397 /* types.swift */, 138 | ); 139 | path = Classes; 140 | sourceTree = ""; 141 | }; 142 | 449125A0D014375C661B01CB0B5B35DC /* Pods-Redux_Example */ = { 143 | isa = PBXGroup; 144 | children = ( 145 | 4517B98C88107A2A3CEAA131B4654BD8 /* Info.plist */, 146 | 86183FB97D3024C7D062FF6FBBDF9E7B /* Pods-Redux_Example.modulemap */, 147 | 19F34E897D8E929D5E70E5F0472E1DBB /* Pods-Redux_Example-acknowledgements.markdown */, 148 | C6D1E74C2CCB36DA9FD48C08918A8F73 /* Pods-Redux_Example-acknowledgements.plist */, 149 | 620224777D2803421BBE626D712B61DB /* Pods-Redux_Example-dummy.m */, 150 | D716D774DEC118B5401C58822364A815 /* Pods-Redux_Example-frameworks.sh */, 151 | EC1EB038E600F733FFD9E82219C517C1 /* Pods-Redux_Example-resources.sh */, 152 | BB2E9333CE5022BD96D88CDBF45A1435 /* Pods-Redux_Example-umbrella.h */, 153 | 268EE0A2B991BD87F83D140C272A5D15 /* Pods-Redux_Example.debug.xcconfig */, 154 | EB4F558CF8B834FB911D9C1EE06BDE51 /* Pods-Redux_Example.release.xcconfig */, 155 | ); 156 | name = "Pods-Redux_Example"; 157 | path = "Target Support Files/Pods-Redux_Example"; 158 | sourceTree = ""; 159 | }; 160 | 53F661C0CA7190D2CF05023FB33D61E4 /* iOS */ = { 161 | isa = PBXGroup; 162 | children = ( 163 | D863289C844AF0D209344DE88E750E22 /* Foundation.framework */, 164 | ); 165 | name = iOS; 166 | sourceTree = ""; 167 | }; 168 | 5D43635347388DDBB7C328D1EB3F5239 /* Development Pods */ = { 169 | isa = PBXGroup; 170 | children = ( 171 | 77AE05E12EFE794ABFF87898A90DDCD9 /* Redux */, 172 | ); 173 | name = "Development Pods"; 174 | sourceTree = ""; 175 | }; 176 | 63C336B78A647A70C9AE05CC69A18B4B /* Pod */ = { 177 | isa = PBXGroup; 178 | children = ( 179 | 006341184BE14D77404CBD84F83BDA1F /* Classes */, 180 | ); 181 | path = Pod; 182 | sourceTree = ""; 183 | }; 184 | 64E6B5203C9B216D47A7FAC3404A0A15 /* Pods-Redux_Tests */ = { 185 | isa = PBXGroup; 186 | children = ( 187 | 768B21DC09171AAB95C64BD22F694C70 /* Info.plist */, 188 | B0D3C400AB7466AC6ADC219CF0C114E0 /* Pods-Redux_Tests.modulemap */, 189 | 7A8F9FDA96F44435B18C6F18CC16B631 /* Pods-Redux_Tests-acknowledgements.markdown */, 190 | 72F3D738A63021DDA4333EFA9B877474 /* Pods-Redux_Tests-acknowledgements.plist */, 191 | 03E876BB17B7FEB86B6C4BA3386EBFFB /* Pods-Redux_Tests-dummy.m */, 192 | 37853880232253B735AA0AF8478511AD /* Pods-Redux_Tests-frameworks.sh */, 193 | 8B5A020BE249981652D971254A185E19 /* Pods-Redux_Tests-resources.sh */, 194 | 7446989795D4076656DBD009F87138B0 /* Pods-Redux_Tests-umbrella.h */, 195 | CABBB3613E0E8A5BE57FF9C168AB24BA /* Pods-Redux_Tests.debug.xcconfig */, 196 | 2886449C968D0A3B6E334A3C468AF212 /* Pods-Redux_Tests.release.xcconfig */, 197 | ); 198 | name = "Pods-Redux_Tests"; 199 | path = "Target Support Files/Pods-Redux_Tests"; 200 | sourceTree = ""; 201 | }; 202 | 6AB7C75A5D5096049389AA1E7FE7A96F /* Targets Support Files */ = { 203 | isa = PBXGroup; 204 | children = ( 205 | 449125A0D014375C661B01CB0B5B35DC /* Pods-Redux_Example */, 206 | 64E6B5203C9B216D47A7FAC3404A0A15 /* Pods-Redux_Tests */, 207 | ); 208 | name = "Targets Support Files"; 209 | sourceTree = ""; 210 | }; 211 | 77AE05E12EFE794ABFF87898A90DDCD9 /* Redux */ = { 212 | isa = PBXGroup; 213 | children = ( 214 | 63C336B78A647A70C9AE05CC69A18B4B /* Pod */, 215 | C3082D76FF771E3E287542D093565C93 /* Support Files */, 216 | ); 217 | name = Redux; 218 | path = ../..; 219 | sourceTree = ""; 220 | }; 221 | 7DB346D0F39D3F0E887471402A8071AB = { 222 | isa = PBXGroup; 223 | children = ( 224 | BA6428E9F66FD5A23C0A2E06ED26CD2F /* Podfile */, 225 | 5D43635347388DDBB7C328D1EB3F5239 /* Development Pods */, 226 | BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */, 227 | CCA510CFBEA2D207524CDA0D73C3B561 /* Products */, 228 | 6AB7C75A5D5096049389AA1E7FE7A96F /* Targets Support Files */, 229 | ); 230 | sourceTree = ""; 231 | }; 232 | BC3CA7F9E30CC8F7E2DD044DD34432FC /* Frameworks */ = { 233 | isa = PBXGroup; 234 | children = ( 235 | 53F661C0CA7190D2CF05023FB33D61E4 /* iOS */, 236 | ); 237 | name = Frameworks; 238 | sourceTree = ""; 239 | }; 240 | C3082D76FF771E3E287542D093565C93 /* Support Files */ = { 241 | isa = PBXGroup; 242 | children = ( 243 | 1E42A10BB003504F34EBFFFA5A188991 /* Info.plist */, 244 | 7F161FC562A1ACB1D39F9884556FB405 /* Redux.modulemap */, 245 | 912DDCCE9AAAAF7AA2BF2D7648BE4737 /* Redux.xcconfig */, 246 | E99DFCAB071609C711CF047EC18477F8 /* Redux-Private.xcconfig */, 247 | 7F69CAB7A6B9FB6800709A471FE7788D /* Redux-dummy.m */, 248 | 7D88C7B858532831D0DC5A38F4EA6CCE /* Redux-prefix.pch */, 249 | 11736635A3DC7E3DCF1DCED9D62F1FE9 /* Redux-umbrella.h */, 250 | ); 251 | name = "Support Files"; 252 | path = "Example/Pods/Target Support Files/Redux"; 253 | sourceTree = ""; 254 | }; 255 | CCA510CFBEA2D207524CDA0D73C3B561 /* Products */ = { 256 | isa = PBXGroup; 257 | children = ( 258 | 6AA3BC4A8856CAC0BF349A2D670720B5 /* Pods_Redux_Example.framework */, 259 | 5F848A9499195CCF4538AE2E8385378E /* Pods_Redux_Tests.framework */, 260 | 3C40063DEF4593C496EE5CF5674F8F93 /* Redux.bundle */, 261 | 7C795B754B90E9FFA838D1F36DA9DDB6 /* Redux.framework */, 262 | ); 263 | name = Products; 264 | sourceTree = ""; 265 | }; 266 | /* End PBXGroup section */ 267 | 268 | /* Begin PBXHeadersBuildPhase section */ 269 | 97CAF29D036445B666995B4451B939CB /* Headers */ = { 270 | isa = PBXHeadersBuildPhase; 271 | buildActionMask = 2147483647; 272 | files = ( 273 | B2E0DE5B4CC124926DC0DA76D08B1A8B /* Pods-Redux_Example-umbrella.h in Headers */, 274 | ); 275 | runOnlyForDeploymentPostprocessing = 0; 276 | }; 277 | DD76F7028EF94F87DA581400B59E3C79 /* Headers */ = { 278 | isa = PBXHeadersBuildPhase; 279 | buildActionMask = 2147483647; 280 | files = ( 281 | F42C35EE3D3A49C5E40528DA47C18FD0 /* Pods-Redux_Tests-umbrella.h in Headers */, 282 | ); 283 | runOnlyForDeploymentPostprocessing = 0; 284 | }; 285 | E9EEA55C6548C02663C31113E41A5A38 /* Headers */ = { 286 | isa = PBXHeadersBuildPhase; 287 | buildActionMask = 2147483647; 288 | files = ( 289 | B9D0F90A51534C585FE372811F4B0DD4 /* Redux-umbrella.h in Headers */, 290 | ); 291 | runOnlyForDeploymentPostprocessing = 0; 292 | }; 293 | /* End PBXHeadersBuildPhase section */ 294 | 295 | /* Begin PBXNativeTarget section */ 296 | 161A203DF817BE4CCA87DF43DE2AC408 /* Pods-Redux_Tests */ = { 297 | isa = PBXNativeTarget; 298 | buildConfigurationList = 643255CB906E92E1570F6561310AA046 /* Build configuration list for PBXNativeTarget "Pods-Redux_Tests" */; 299 | buildPhases = ( 300 | 3D9B75F4F4AAB3C0A8F67B2085516234 /* Sources */, 301 | 20548FF161627E53A472B8DE9139B766 /* Frameworks */, 302 | DD76F7028EF94F87DA581400B59E3C79 /* Headers */, 303 | ); 304 | buildRules = ( 305 | ); 306 | dependencies = ( 307 | 1B03FF06CF8287077B525A1FB8186A18 /* PBXTargetDependency */, 308 | ); 309 | name = "Pods-Redux_Tests"; 310 | productName = "Pods-Redux_Tests"; 311 | productReference = 5F848A9499195CCF4538AE2E8385378E /* Pods_Redux_Tests.framework */; 312 | productType = "com.apple.product-type.framework"; 313 | }; 314 | 499BC88DD014FF7E51E6895B60EDBEBD /* Pods-Redux_Example */ = { 315 | isa = PBXNativeTarget; 316 | buildConfigurationList = 5E68A0B9588E49ADE35410F967EB5251 /* Build configuration list for PBXNativeTarget "Pods-Redux_Example" */; 317 | buildPhases = ( 318 | 7261C574ADDA6853583E6D0D35E346C4 /* Sources */, 319 | 3AE8F67260C03BF8D036A22FE1036A3E /* Frameworks */, 320 | 97CAF29D036445B666995B4451B939CB /* Headers */, 321 | ); 322 | buildRules = ( 323 | ); 324 | dependencies = ( 325 | B28E4C53476C8E8A81564ADFBA0FE738 /* PBXTargetDependency */, 326 | ); 327 | name = "Pods-Redux_Example"; 328 | productName = "Pods-Redux_Example"; 329 | productReference = 6AA3BC4A8856CAC0BF349A2D670720B5 /* Pods_Redux_Example.framework */; 330 | productType = "com.apple.product-type.framework"; 331 | }; 332 | 8052ADE55F1B8B9FA6DECBCA97AF2455 /* Redux-Redux */ = { 333 | isa = PBXNativeTarget; 334 | buildConfigurationList = D0A561170C20EB9B1EB2AE6E9890300F /* Build configuration list for PBXNativeTarget "Redux-Redux" */; 335 | buildPhases = ( 336 | 2ACD4F238B1FCE312F24DF43A3D01408 /* Sources */, 337 | 190AA2AAED602944D8BA84F07414A15B /* Frameworks */, 338 | 2CC93101797716E6EB61485587C79CFB /* Resources */, 339 | ); 340 | buildRules = ( 341 | ); 342 | dependencies = ( 343 | ); 344 | name = "Redux-Redux"; 345 | productName = "Redux-Redux"; 346 | productReference = 3C40063DEF4593C496EE5CF5674F8F93 /* Redux.bundle */; 347 | productType = "com.apple.product-type.bundle"; 348 | }; 349 | 83B5480CD64EEE70EC1B86FE9E9B4F29 /* Redux */ = { 350 | isa = PBXNativeTarget; 351 | buildConfigurationList = 2AA7EC61688D6D4F4B50371F9D717FB6 /* Build configuration list for PBXNativeTarget "Redux" */; 352 | buildPhases = ( 353 | 3458EE42B41908F1AB2C663EC816D5BB /* Sources */, 354 | A8A22059F8EBED9CFA757E2FDD281496 /* Frameworks */, 355 | BF7263D2374D4727E5F66999C3514456 /* Resources */, 356 | E9EEA55C6548C02663C31113E41A5A38 /* Headers */, 357 | ); 358 | buildRules = ( 359 | ); 360 | dependencies = ( 361 | CA32DC4CADC7C533CA2AED9D936D14CC /* PBXTargetDependency */, 362 | ); 363 | name = Redux; 364 | productName = Redux; 365 | productReference = 7C795B754B90E9FFA838D1F36DA9DDB6 /* Redux.framework */; 366 | productType = "com.apple.product-type.framework"; 367 | }; 368 | /* End PBXNativeTarget section */ 369 | 370 | /* Begin PBXProject section */ 371 | D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { 372 | isa = PBXProject; 373 | attributes = { 374 | LastSwiftUpdateCheck = 0700; 375 | LastUpgradeCheck = 0700; 376 | TargetAttributes = { 377 | 161A203DF817BE4CCA87DF43DE2AC408 = { 378 | LastSwiftMigration = 0800; 379 | }; 380 | 8052ADE55F1B8B9FA6DECBCA97AF2455 = { 381 | LastSwiftMigration = 0800; 382 | }; 383 | 83B5480CD64EEE70EC1B86FE9E9B4F29 = { 384 | LastSwiftMigration = 0800; 385 | }; 386 | }; 387 | }; 388 | buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; 389 | compatibilityVersion = "Xcode 3.2"; 390 | developmentRegion = English; 391 | hasScannedForEncodings = 0; 392 | knownRegions = ( 393 | en, 394 | ); 395 | mainGroup = 7DB346D0F39D3F0E887471402A8071AB; 396 | productRefGroup = CCA510CFBEA2D207524CDA0D73C3B561 /* Products */; 397 | projectDirPath = ""; 398 | projectRoot = ""; 399 | targets = ( 400 | 499BC88DD014FF7E51E6895B60EDBEBD /* Pods-Redux_Example */, 401 | 161A203DF817BE4CCA87DF43DE2AC408 /* Pods-Redux_Tests */, 402 | 83B5480CD64EEE70EC1B86FE9E9B4F29 /* Redux */, 403 | 8052ADE55F1B8B9FA6DECBCA97AF2455 /* Redux-Redux */, 404 | ); 405 | }; 406 | /* End PBXProject section */ 407 | 408 | /* Begin PBXResourcesBuildPhase section */ 409 | 2CC93101797716E6EB61485587C79CFB /* Resources */ = { 410 | isa = PBXResourcesBuildPhase; 411 | buildActionMask = 2147483647; 412 | files = ( 413 | ); 414 | runOnlyForDeploymentPostprocessing = 0; 415 | }; 416 | BF7263D2374D4727E5F66999C3514456 /* Resources */ = { 417 | isa = PBXResourcesBuildPhase; 418 | buildActionMask = 2147483647; 419 | files = ( 420 | 08A847CBFB33DCFA9A74CEC0CDB78AAA /* Redux.bundle in Resources */, 421 | ); 422 | runOnlyForDeploymentPostprocessing = 0; 423 | }; 424 | /* End PBXResourcesBuildPhase section */ 425 | 426 | /* Begin PBXSourcesBuildPhase section */ 427 | 2ACD4F238B1FCE312F24DF43A3D01408 /* Sources */ = { 428 | isa = PBXSourcesBuildPhase; 429 | buildActionMask = 2147483647; 430 | files = ( 431 | ); 432 | runOnlyForDeploymentPostprocessing = 0; 433 | }; 434 | 3458EE42B41908F1AB2C663EC816D5BB /* Sources */ = { 435 | isa = PBXSourcesBuildPhase; 436 | buildActionMask = 2147483647; 437 | files = ( 438 | 7224614E4DAA346FBABD39ED675B3B23 /* ProgrammerAssertions.swift in Sources */, 439 | E4C45EA868933D574C479816D9D81F34 /* Redux-dummy.m in Sources */, 440 | 20C55F425C226AEC97E69218102AFA42 /* StoreConnector.swift in Sources */, 441 | 66278D7683FC7C8484F8992F2CCC5E6A /* StoreType.swift in Sources */, 442 | 9BDC434EDEF46D505DDFB2DC6FBDD3D8 /* combineReducers.swift in Sources */, 443 | F97F82CCB3608733BBBFA193F2DC6DD3 /* createStore.swift in Sources */, 444 | 526FFA82A8745C3EC116188A9F55C5C9 /* types.swift in Sources */, 445 | ); 446 | runOnlyForDeploymentPostprocessing = 0; 447 | }; 448 | 3D9B75F4F4AAB3C0A8F67B2085516234 /* Sources */ = { 449 | isa = PBXSourcesBuildPhase; 450 | buildActionMask = 2147483647; 451 | files = ( 452 | 5AD39CC02C5FA477BC67CE4E54E25C41 /* Pods-Redux_Tests-dummy.m in Sources */, 453 | ); 454 | runOnlyForDeploymentPostprocessing = 0; 455 | }; 456 | 7261C574ADDA6853583E6D0D35E346C4 /* Sources */ = { 457 | isa = PBXSourcesBuildPhase; 458 | buildActionMask = 2147483647; 459 | files = ( 460 | 497B3BAB1A84CCC82C4D5CCAA819B00E /* Pods-Redux_Example-dummy.m in Sources */, 461 | ); 462 | runOnlyForDeploymentPostprocessing = 0; 463 | }; 464 | /* End PBXSourcesBuildPhase section */ 465 | 466 | /* Begin PBXTargetDependency section */ 467 | 1B03FF06CF8287077B525A1FB8186A18 /* PBXTargetDependency */ = { 468 | isa = PBXTargetDependency; 469 | name = Redux; 470 | target = 83B5480CD64EEE70EC1B86FE9E9B4F29 /* Redux */; 471 | targetProxy = 192577B3E84357CB973643EE69D413C7 /* PBXContainerItemProxy */; 472 | }; 473 | B28E4C53476C8E8A81564ADFBA0FE738 /* PBXTargetDependency */ = { 474 | isa = PBXTargetDependency; 475 | name = Redux; 476 | target = 83B5480CD64EEE70EC1B86FE9E9B4F29 /* Redux */; 477 | targetProxy = C55F840917032CB545FD25CDDC092012 /* PBXContainerItemProxy */; 478 | }; 479 | CA32DC4CADC7C533CA2AED9D936D14CC /* PBXTargetDependency */ = { 480 | isa = PBXTargetDependency; 481 | name = "Redux-Redux"; 482 | target = 8052ADE55F1B8B9FA6DECBCA97AF2455 /* Redux-Redux */; 483 | targetProxy = F9732E9BCE5219758902130465B65532 /* PBXContainerItemProxy */; 484 | }; 485 | /* End PBXTargetDependency section */ 486 | 487 | /* Begin XCBuildConfiguration section */ 488 | 0B2A71364DBC327F3E74F002658E2D88 /* Release */ = { 489 | isa = XCBuildConfiguration; 490 | baseConfigurationReference = E99DFCAB071609C711CF047EC18477F8 /* Redux-Private.xcconfig */; 491 | buildSettings = { 492 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 493 | CURRENT_PROJECT_VERSION = 0.1.0; 494 | DEFINES_MODULE = YES; 495 | DYLIB_COMPATIBILITY_VERSION = 0.1.0; 496 | DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; 497 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 498 | ENABLE_STRICT_OBJC_MSGSEND = YES; 499 | ENABLE_TESTABILITY = YES; 500 | GCC_PREFIX_HEADER = "Target Support Files/Redux/Redux-prefix.pch"; 501 | INFOPLIST_FILE = "Target Support Files/Redux/Info.plist"; 502 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 503 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 504 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 505 | MODULEMAP_FILE = "Target Support Files/Redux/Redux.modulemap"; 506 | MTL_ENABLE_DEBUG_INFO = NO; 507 | PRODUCT_NAME = Redux; 508 | SDKROOT = iphoneos; 509 | SKIP_INSTALL = YES; 510 | SWIFT_VERSION = 3.0; 511 | TARGETED_DEVICE_FAMILY = "1,2"; 512 | VERSIONING_SYSTEM = "apple-generic"; 513 | VERSION_INFO_PREFIX = ""; 514 | }; 515 | name = Release; 516 | }; 517 | 0E56D6AFB6B3104988405CA353C9F0D8 /* Release */ = { 518 | isa = XCBuildConfiguration; 519 | baseConfigurationReference = 2886449C968D0A3B6E334A3C468AF212 /* Pods-Redux_Tests.release.xcconfig */; 520 | buildSettings = { 521 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 522 | CURRENT_PROJECT_VERSION = 1; 523 | DEFINES_MODULE = YES; 524 | DYLIB_COMPATIBILITY_VERSION = 1; 525 | DYLIB_CURRENT_VERSION = 1; 526 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 527 | ENABLE_STRICT_OBJC_MSGSEND = YES; 528 | INFOPLIST_FILE = "Target Support Files/Pods-Redux_Tests/Info.plist"; 529 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 530 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 531 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 532 | MODULEMAP_FILE = "Target Support Files/Pods-Redux_Tests/Pods-Redux_Tests.modulemap"; 533 | MTL_ENABLE_DEBUG_INFO = NO; 534 | OTHER_LDFLAGS = ""; 535 | OTHER_LIBTOOLFLAGS = ""; 536 | PODS_ROOT = "$(SRCROOT)"; 537 | PRODUCT_NAME = Pods_Redux_Tests; 538 | SDKROOT = iphoneos; 539 | SKIP_INSTALL = YES; 540 | SWIFT_VERSION = 3.0; 541 | TARGETED_DEVICE_FAMILY = "1,2"; 542 | VERSIONING_SYSTEM = "apple-generic"; 543 | VERSION_INFO_PREFIX = ""; 544 | }; 545 | name = Release; 546 | }; 547 | 10DE1947DAC0ED28F6C0A9F9BD75D546 /* Release */ = { 548 | isa = XCBuildConfiguration; 549 | buildSettings = { 550 | ALWAYS_SEARCH_USER_PATHS = NO; 551 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 552 | CLANG_CXX_LIBRARY = "libc++"; 553 | CLANG_ENABLE_MODULES = YES; 554 | CLANG_ENABLE_OBJC_ARC = YES; 555 | CLANG_WARN_BOOL_CONVERSION = YES; 556 | CLANG_WARN_CONSTANT_CONVERSION = YES; 557 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; 558 | CLANG_WARN_EMPTY_BODY = YES; 559 | CLANG_WARN_ENUM_CONVERSION = YES; 560 | CLANG_WARN_INT_CONVERSION = YES; 561 | CLANG_WARN_OBJC_ROOT_CLASS = YES; 562 | CLANG_WARN_UNREACHABLE_CODE = YES; 563 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 564 | COPY_PHASE_STRIP = YES; 565 | ENABLE_NS_ASSERTIONS = NO; 566 | GCC_C_LANGUAGE_STANDARD = gnu99; 567 | GCC_PREPROCESSOR_DEFINITIONS = "RELEASE=1"; 568 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 569 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 570 | GCC_WARN_UNDECLARED_SELECTOR = YES; 571 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 572 | GCC_WARN_UNUSED_FUNCTION = YES; 573 | GCC_WARN_UNUSED_VARIABLE = YES; 574 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 575 | STRIP_INSTALLED_PRODUCT = NO; 576 | SYMROOT = "${SRCROOT}/../build"; 577 | VALIDATE_PRODUCT = YES; 578 | }; 579 | name = Release; 580 | }; 581 | 3AD4A05A79CD9F8C5023FB4BC76205E3 /* Debug */ = { 582 | isa = XCBuildConfiguration; 583 | baseConfigurationReference = E99DFCAB071609C711CF047EC18477F8 /* Redux-Private.xcconfig */; 584 | buildSettings = { 585 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 586 | CURRENT_PROJECT_VERSION = 0.1.0; 587 | DEFINES_MODULE = YES; 588 | DYLIB_COMPATIBILITY_VERSION = 0.1.0; 589 | DYLIB_CURRENT_VERSION = "$(CURRENT_PROJECT_VERSION)"; 590 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 591 | ENABLE_STRICT_OBJC_MSGSEND = YES; 592 | ENABLE_TESTABILITY = YES; 593 | GCC_PREFIX_HEADER = "Target Support Files/Redux/Redux-prefix.pch"; 594 | INFOPLIST_FILE = "Target Support Files/Redux/Info.plist"; 595 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 596 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 597 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 598 | MODULEMAP_FILE = "Target Support Files/Redux/Redux.modulemap"; 599 | MTL_ENABLE_DEBUG_INFO = YES; 600 | PRODUCT_NAME = Redux; 601 | SDKROOT = iphoneos; 602 | SKIP_INSTALL = YES; 603 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 604 | SWIFT_VERSION = 3.0; 605 | TARGETED_DEVICE_FAMILY = "1,2"; 606 | VERSIONING_SYSTEM = "apple-generic"; 607 | VERSION_INFO_PREFIX = ""; 608 | }; 609 | name = Debug; 610 | }; 611 | 46C16BC87DAE1E194DEB5B31F9488821 /* Debug */ = { 612 | isa = XCBuildConfiguration; 613 | baseConfigurationReference = E99DFCAB071609C711CF047EC18477F8 /* Redux-Private.xcconfig */; 614 | buildSettings = { 615 | ENABLE_STRICT_OBJC_MSGSEND = YES; 616 | PRODUCT_NAME = Redux; 617 | SDKROOT = iphoneos; 618 | SKIP_INSTALL = YES; 619 | SWIFT_VERSION = 3.0; 620 | WRAPPER_EXTENSION = bundle; 621 | }; 622 | name = Debug; 623 | }; 624 | 552D02D5BA751AC2E8790D2811D496CA /* Debug */ = { 625 | isa = XCBuildConfiguration; 626 | buildSettings = { 627 | ALWAYS_SEARCH_USER_PATHS = NO; 628 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 629 | CLANG_CXX_LIBRARY = "libc++"; 630 | CLANG_ENABLE_MODULES = YES; 631 | CLANG_ENABLE_OBJC_ARC = YES; 632 | CLANG_WARN_BOOL_CONVERSION = YES; 633 | CLANG_WARN_CONSTANT_CONVERSION = YES; 634 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; 635 | CLANG_WARN_EMPTY_BODY = YES; 636 | CLANG_WARN_ENUM_CONVERSION = YES; 637 | CLANG_WARN_INT_CONVERSION = YES; 638 | CLANG_WARN_OBJC_ROOT_CLASS = YES; 639 | CLANG_WARN_UNREACHABLE_CODE = YES; 640 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 641 | COPY_PHASE_STRIP = NO; 642 | GCC_C_LANGUAGE_STANDARD = gnu99; 643 | GCC_DYNAMIC_NO_PIC = NO; 644 | GCC_OPTIMIZATION_LEVEL = 0; 645 | GCC_PREPROCESSOR_DEFINITIONS = ( 646 | "DEBUG=1", 647 | "$(inherited)", 648 | ); 649 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 650 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 651 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 652 | GCC_WARN_UNDECLARED_SELECTOR = YES; 653 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 654 | GCC_WARN_UNUSED_FUNCTION = YES; 655 | GCC_WARN_UNUSED_VARIABLE = YES; 656 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 657 | ONLY_ACTIVE_ARCH = YES; 658 | STRIP_INSTALLED_PRODUCT = NO; 659 | SYMROOT = "${SRCROOT}/../build"; 660 | }; 661 | name = Debug; 662 | }; 663 | 7836C9357BCB37D6D45BA35DF5B4EFDE /* Release */ = { 664 | isa = XCBuildConfiguration; 665 | baseConfigurationReference = E99DFCAB071609C711CF047EC18477F8 /* Redux-Private.xcconfig */; 666 | buildSettings = { 667 | ENABLE_STRICT_OBJC_MSGSEND = YES; 668 | PRODUCT_NAME = Redux; 669 | SDKROOT = iphoneos; 670 | SKIP_INSTALL = YES; 671 | SWIFT_VERSION = 3.0; 672 | WRAPPER_EXTENSION = bundle; 673 | }; 674 | name = Release; 675 | }; 676 | 9CEC292CBD3ABD046F67A3275DA13850 /* Release */ = { 677 | isa = XCBuildConfiguration; 678 | baseConfigurationReference = EB4F558CF8B834FB911D9C1EE06BDE51 /* Pods-Redux_Example.release.xcconfig */; 679 | buildSettings = { 680 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 681 | CURRENT_PROJECT_VERSION = 1; 682 | DEFINES_MODULE = YES; 683 | DYLIB_COMPATIBILITY_VERSION = 1; 684 | DYLIB_CURRENT_VERSION = 1; 685 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 686 | ENABLE_STRICT_OBJC_MSGSEND = YES; 687 | INFOPLIST_FILE = "Target Support Files/Pods-Redux_Example/Info.plist"; 688 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 689 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 690 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 691 | MODULEMAP_FILE = "Target Support Files/Pods-Redux_Example/Pods-Redux_Example.modulemap"; 692 | MTL_ENABLE_DEBUG_INFO = NO; 693 | OTHER_LDFLAGS = ""; 694 | OTHER_LIBTOOLFLAGS = ""; 695 | PODS_ROOT = "$(SRCROOT)"; 696 | PRODUCT_NAME = Pods_Redux_Example; 697 | SDKROOT = iphoneos; 698 | SKIP_INSTALL = YES; 699 | TARGETED_DEVICE_FAMILY = "1,2"; 700 | VERSIONING_SYSTEM = "apple-generic"; 701 | VERSION_INFO_PREFIX = ""; 702 | }; 703 | name = Release; 704 | }; 705 | A2C04CA94286AB7E8131D958FE4E9618 /* Debug */ = { 706 | isa = XCBuildConfiguration; 707 | baseConfigurationReference = CABBB3613E0E8A5BE57FF9C168AB24BA /* Pods-Redux_Tests.debug.xcconfig */; 708 | buildSettings = { 709 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 710 | CURRENT_PROJECT_VERSION = 1; 711 | DEFINES_MODULE = YES; 712 | DYLIB_COMPATIBILITY_VERSION = 1; 713 | DYLIB_CURRENT_VERSION = 1; 714 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 715 | ENABLE_STRICT_OBJC_MSGSEND = YES; 716 | INFOPLIST_FILE = "Target Support Files/Pods-Redux_Tests/Info.plist"; 717 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 718 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 719 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 720 | MODULEMAP_FILE = "Target Support Files/Pods-Redux_Tests/Pods-Redux_Tests.modulemap"; 721 | MTL_ENABLE_DEBUG_INFO = YES; 722 | OTHER_LDFLAGS = ""; 723 | OTHER_LIBTOOLFLAGS = ""; 724 | PODS_ROOT = "$(SRCROOT)"; 725 | PRODUCT_NAME = Pods_Redux_Tests; 726 | SDKROOT = iphoneos; 727 | SKIP_INSTALL = YES; 728 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 729 | SWIFT_VERSION = 3.0; 730 | TARGETED_DEVICE_FAMILY = "1,2"; 731 | VERSIONING_SYSTEM = "apple-generic"; 732 | VERSION_INFO_PREFIX = ""; 733 | }; 734 | name = Debug; 735 | }; 736 | DA610E21606852914C55E06F835CEFD8 /* Debug */ = { 737 | isa = XCBuildConfiguration; 738 | baseConfigurationReference = 268EE0A2B991BD87F83D140C272A5D15 /* Pods-Redux_Example.debug.xcconfig */; 739 | buildSettings = { 740 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 741 | CURRENT_PROJECT_VERSION = 1; 742 | DEFINES_MODULE = YES; 743 | DYLIB_COMPATIBILITY_VERSION = 1; 744 | DYLIB_CURRENT_VERSION = 1; 745 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 746 | ENABLE_STRICT_OBJC_MSGSEND = YES; 747 | INFOPLIST_FILE = "Target Support Files/Pods-Redux_Example/Info.plist"; 748 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 749 | IPHONEOS_DEPLOYMENT_TARGET = 8.3; 750 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 751 | MODULEMAP_FILE = "Target Support Files/Pods-Redux_Example/Pods-Redux_Example.modulemap"; 752 | MTL_ENABLE_DEBUG_INFO = YES; 753 | OTHER_LDFLAGS = ""; 754 | OTHER_LIBTOOLFLAGS = ""; 755 | PODS_ROOT = "$(SRCROOT)"; 756 | PRODUCT_NAME = Pods_Redux_Example; 757 | SDKROOT = iphoneos; 758 | SKIP_INSTALL = YES; 759 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 760 | TARGETED_DEVICE_FAMILY = "1,2"; 761 | VERSIONING_SYSTEM = "apple-generic"; 762 | VERSION_INFO_PREFIX = ""; 763 | }; 764 | name = Debug; 765 | }; 766 | /* End XCBuildConfiguration section */ 767 | 768 | /* Begin XCConfigurationList section */ 769 | 2AA7EC61688D6D4F4B50371F9D717FB6 /* Build configuration list for PBXNativeTarget "Redux" */ = { 770 | isa = XCConfigurationList; 771 | buildConfigurations = ( 772 | 3AD4A05A79CD9F8C5023FB4BC76205E3 /* Debug */, 773 | 0B2A71364DBC327F3E74F002658E2D88 /* Release */, 774 | ); 775 | defaultConfigurationIsVisible = 0; 776 | defaultConfigurationName = Release; 777 | }; 778 | 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { 779 | isa = XCConfigurationList; 780 | buildConfigurations = ( 781 | 552D02D5BA751AC2E8790D2811D496CA /* Debug */, 782 | 10DE1947DAC0ED28F6C0A9F9BD75D546 /* Release */, 783 | ); 784 | defaultConfigurationIsVisible = 0; 785 | defaultConfigurationName = Release; 786 | }; 787 | 5E68A0B9588E49ADE35410F967EB5251 /* Build configuration list for PBXNativeTarget "Pods-Redux_Example" */ = { 788 | isa = XCConfigurationList; 789 | buildConfigurations = ( 790 | DA610E21606852914C55E06F835CEFD8 /* Debug */, 791 | 9CEC292CBD3ABD046F67A3275DA13850 /* Release */, 792 | ); 793 | defaultConfigurationIsVisible = 0; 794 | defaultConfigurationName = Release; 795 | }; 796 | 643255CB906E92E1570F6561310AA046 /* Build configuration list for PBXNativeTarget "Pods-Redux_Tests" */ = { 797 | isa = XCConfigurationList; 798 | buildConfigurations = ( 799 | A2C04CA94286AB7E8131D958FE4E9618 /* Debug */, 800 | 0E56D6AFB6B3104988405CA353C9F0D8 /* Release */, 801 | ); 802 | defaultConfigurationIsVisible = 0; 803 | defaultConfigurationName = Release; 804 | }; 805 | D0A561170C20EB9B1EB2AE6E9890300F /* Build configuration list for PBXNativeTarget "Redux-Redux" */ = { 806 | isa = XCConfigurationList; 807 | buildConfigurations = ( 808 | 46C16BC87DAE1E194DEB5B31F9488821 /* Debug */, 809 | 7836C9357BCB37D6D45BA35DF5B4EFDE /* Release */, 810 | ); 811 | defaultConfigurationIsVisible = 0; 812 | defaultConfigurationName = Release; 813 | }; 814 | /* End XCConfigurationList section */ 815 | }; 816 | rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; 817 | } 818 | --------------------------------------------------------------------------------