├── Screenshoot
└── new ss.png
├── Pods
├── Target Support Files
│ ├── Alamofire
│ │ ├── Alamofire.modulemap
│ │ ├── Alamofire-dummy.m
│ │ ├── Alamofire-prefix.pch
│ │ ├── Alamofire-umbrella.h
│ │ ├── Alamofire.xcconfig
│ │ ├── Alamofire.debug.xcconfig
│ │ ├── Alamofire.release.xcconfig
│ │ ├── Info.plist
│ │ └── Alamofire-Info.plist
│ ├── SwiftyJSON
│ │ ├── SwiftyJSON.modulemap
│ │ ├── SwiftyJSON-dummy.m
│ │ ├── SwiftyJSON-prefix.pch
│ │ ├── SwiftyJSON-umbrella.h
│ │ ├── SwiftyJSON.xcconfig
│ │ ├── SwiftyJSON.debug.xcconfig
│ │ ├── SwiftyJSON.release.xcconfig
│ │ ├── Info.plist
│ │ └── SwiftyJSON-Info.plist
│ ├── Pods-MVPSwift
│ │ ├── Pods-MVPSwift.modulemap
│ │ ├── Pods-MVPSwift-dummy.m
│ │ ├── Pods-MVPSwift-umbrella.h
│ │ ├── Info.plist
│ │ ├── Pods-MVPSwift-Info.plist
│ │ ├── Pods-MVPSwift.debug.xcconfig
│ │ ├── Pods-MVPSwift.release.xcconfig
│ │ ├── Pods-MVPSwift-acknowledgements.markdown
│ │ ├── Pods-MVPSwift-acknowledgements.plist
│ │ ├── Pods-MVPSwift-resources.sh
│ │ └── Pods-MVPSwift-frameworks.sh
│ ├── Pods-MVPSwiftTests
│ │ ├── Pods-MVPSwiftTests.modulemap
│ │ ├── Pods-MVPSwiftTests-dummy.m
│ │ ├── Pods-MVPSwiftTests-acknowledgements.markdown
│ │ ├── Pods-MVPSwiftTests-umbrella.h
│ │ ├── Pods-MVPSwiftTests.debug.xcconfig
│ │ ├── Pods-MVPSwiftTests.release.xcconfig
│ │ ├── Info.plist
│ │ ├── Pods-MVPSwiftTests-Info.plist
│ │ ├── Pods-MVPSwiftTests-acknowledgements.plist
│ │ ├── Pods-MVPSwiftTests-frameworks.sh
│ │ └── Pods-MVPSwiftTests-resources.sh
│ └── Pods-MVPSwiftUITests
│ │ ├── Pods-MVPSwiftUITests.modulemap
│ │ ├── Pods-MVPSwiftUITests-acknowledgements.markdown
│ │ ├── Pods-MVPSwiftUITests-dummy.m
│ │ ├── Pods-MVPSwiftUITests-umbrella.h
│ │ ├── Pods-MVPSwiftUITests.debug.xcconfig
│ │ ├── Pods-MVPSwiftUITests.release.xcconfig
│ │ ├── Info.plist
│ │ ├── Pods-MVPSwiftUITests-Info.plist
│ │ ├── Pods-MVPSwiftUITests-acknowledgements.plist
│ │ ├── Pods-MVPSwiftUITests-frameworks.sh
│ │ └── Pods-MVPSwiftUITests-resources.sh
├── Manifest.lock
├── SwiftyJSON
│ └── LICENSE
├── Alamofire
│ ├── LICENSE
│ └── Source
│ │ ├── DispatchQueue+Alamofire.swift
│ │ ├── Alamofire.swift
│ │ ├── URLRequest+Alamofire.swift
│ │ ├── URLSessionConfiguration+Alamofire.swift
│ │ ├── StringEncoding+Alamofire.swift
│ │ ├── AlamofireExtended.swift
│ │ ├── HTTPMethod.swift
│ │ ├── OperationQueue+Alamofire.swift
│ │ ├── MultipartUpload.swift
│ │ ├── URLConvertible+URLRequestConvertible.swift
│ │ ├── Result+Alamofire.swift
│ │ ├── CachedResponseHandler.swift
│ │ ├── RedirectHandler.swift
│ │ ├── Protected.swift
│ │ ├── Notifications.swift
│ │ └── RequestTaskMap.swift
└── Pods.xcodeproj
│ └── xcuserdata
│ ├── nandawisnu.xcuserdatad
│ └── xcschemes
│ │ ├── xcschememanagement.plist
│ │ ├── Pods-MVPSwift.xcscheme
│ │ ├── Pods-MVPSwiftTests.xcscheme
│ │ ├── Pods-MVPSwiftUITests.xcscheme
│ │ ├── Alamofire.xcscheme
│ │ └── SwiftyJSON.xcscheme
│ ├── nandawperdana.xcuserdatad
│ └── xcschemes
│ │ ├── xcschememanagement.plist
│ │ ├── Alamofire.xcscheme
│ │ ├── SwiftyJSON.xcscheme
│ │ ├── Pods-MVPSwift.xcscheme
│ │ ├── Pods-MVPSwiftTests.xcscheme
│ │ └── Pods-MVPSwiftUITests.xcscheme
│ └── NwP.xcuserdatad
│ └── xcschemes
│ ├── xcschememanagement.plist
│ ├── Alamofire.xcscheme
│ ├── SwiftyJSON.xcscheme
│ ├── Pods-MVPSwift.xcscheme
│ ├── Pods-MVPSwiftTests.xcscheme
│ └── Pods-MVPSwiftUITests.xcscheme
├── MVPSwift.xcworkspace
├── xcuserdata
│ ├── NwP.xcuserdatad
│ │ ├── xcdebugger
│ │ │ └── Breakpoints_v2.xcbkptlist
│ │ └── UserInterfaceState.xcuserstate
│ ├── nandawisnu.xcuserdatad
│ │ ├── UserInterfaceState.xcuserstate
│ │ └── xcdebugger
│ │ │ └── Breakpoints_v2.xcbkptlist
│ └── nandawperdana.xcuserdatad
│ │ └── UserInterfaceState.xcuserstate
├── contents.xcworkspacedata
└── xcshareddata
│ └── IDEWorkspaceChecks.plist
├── MVPSwift.xcodeproj
├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ └── xcuserdata
│ │ └── NwP.xcuserdatad
│ │ └── UserInterfaceState.xcuserstate
└── xcuserdata
│ ├── nandawperdana.xcuserdatad
│ └── xcschemes
│ │ └── xcschememanagement.plist
│ ├── nandawisnu.xcuserdatad
│ └── xcschemes
│ │ └── xcschememanagement.plist
│ └── NwP.xcuserdatad
│ └── xcschemes
│ ├── xcschememanagement.plist
│ └── MVPSwift.xcscheme
├── Podfile.lock
├── Podfile
├── MVPSwiftTests
├── Info.plist
└── MVPSwiftTests.swift
├── MVPSwiftUITests
├── Info.plist
└── MVPSwiftUITests.swift
├── MVPSwift
├── api
│ ├── PeopleService.swift
│ └── APICallManager.swift
├── Assets.xcassets
│ └── AppIcon.appiconset
│ │ └── Contents.json
├── presentation
│ ├── view
│ │ ├── PeopleAdapter.swift
│ │ ├── PeopleCell.swift
│ │ └── PeopleViewController.swift
│ └── presenter
│ │ └── PeoplePresenter.swift
├── Info.plist
├── Base.lproj
│ └── LaunchScreen.storyboard
├── model
│ └── People.swift
└── AppDelegate.swift
└── README.md
/Screenshoot/new ss.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nandawperdana/ios-mvp-swift/HEAD/Screenshoot/new ss.png
--------------------------------------------------------------------------------
/Pods/Target Support Files/Alamofire/Alamofire.modulemap:
--------------------------------------------------------------------------------
1 | framework module Alamofire {
2 | umbrella header "Alamofire-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/SwiftyJSON/SwiftyJSON.modulemap:
--------------------------------------------------------------------------------
1 | framework module SwiftyJSON {
2 | umbrella header "SwiftyJSON-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/MVPSwift.xcworkspace/xcuserdata/NwP.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Alamofire/Alamofire-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_Alamofire : NSObject
3 | @end
4 | @implementation PodsDummy_Alamofire
5 | @end
6 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwift/Pods-MVPSwift.modulemap:
--------------------------------------------------------------------------------
1 | framework module Pods_MVPSwift {
2 | umbrella header "Pods-MVPSwift-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_SwiftyJSON : NSObject
3 | @end
4 | @implementation PodsDummy_SwiftyJSON
5 | @end
6 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwift/Pods-MVPSwift-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_Pods_MVPSwift : NSObject
3 | @end
4 | @implementation PodsDummy_Pods_MVPSwift
5 | @end
6 |
--------------------------------------------------------------------------------
/MVPSwift.xcworkspace/xcuserdata/NwP.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nandawperdana/ios-mvp-swift/HEAD/MVPSwift.xcworkspace/xcuserdata/NwP.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwiftTests/Pods-MVPSwiftTests.modulemap:
--------------------------------------------------------------------------------
1 | framework module Pods_MVPSwiftTests {
2 | umbrella header "Pods-MVPSwiftTests-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/MVPSwift.xcworkspace/xcuserdata/nandawisnu.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nandawperdana/ios-mvp-swift/HEAD/MVPSwift.xcworkspace/xcuserdata/nandawisnu.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwiftTests/Pods-MVPSwiftTests-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_Pods_MVPSwiftTests : NSObject
3 | @end
4 | @implementation PodsDummy_Pods_MVPSwiftTests
5 | @end
6 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwiftUITests/Pods-MVPSwiftUITests.modulemap:
--------------------------------------------------------------------------------
1 | framework module Pods_MVPSwiftUITests {
2 | umbrella header "Pods-MVPSwiftUITests-umbrella.h"
3 |
4 | export *
5 | module * { export * }
6 | }
7 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwiftTests/Pods-MVPSwiftTests-acknowledgements.markdown:
--------------------------------------------------------------------------------
1 | # Acknowledgements
2 | This application makes use of the following third party libraries:
3 | Generated by CocoaPods - https://cocoapods.org
4 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwiftUITests/Pods-MVPSwiftUITests-acknowledgements.markdown:
--------------------------------------------------------------------------------
1 | # Acknowledgements
2 | This application makes use of the following third party libraries:
3 | Generated by CocoaPods - https://cocoapods.org
4 |
--------------------------------------------------------------------------------
/MVPSwift.xcworkspace/xcuserdata/nandawperdana.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nandawperdana/ios-mvp-swift/HEAD/MVPSwift.xcworkspace/xcuserdata/nandawperdana.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwiftUITests/Pods-MVPSwiftUITests-dummy.m:
--------------------------------------------------------------------------------
1 | #import
2 | @interface PodsDummy_Pods_MVPSwiftUITests : NSObject
3 | @end
4 | @implementation PodsDummy_Pods_MVPSwiftUITests
5 | @end
6 |
--------------------------------------------------------------------------------
/MVPSwift.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/MVPSwift.xcodeproj/project.xcworkspace/xcuserdata/NwP.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nandawperdana/ios-mvp-swift/HEAD/MVPSwift.xcodeproj/project.xcworkspace/xcuserdata/NwP.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/MVPSwift.xcworkspace/xcuserdata/nandawisnu.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Alamofire/Alamofire-prefix.pch:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-prefix.pch:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
--------------------------------------------------------------------------------
/MVPSwift.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/MVPSwift.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Alamofire/Alamofire-umbrella.h:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
14 | FOUNDATION_EXPORT double AlamofireVersionNumber;
15 | FOUNDATION_EXPORT const unsigned char AlamofireVersionString[];
16 |
17 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-umbrella.h:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
14 | FOUNDATION_EXPORT double SwiftyJSONVersionNumber;
15 | FOUNDATION_EXPORT const unsigned char SwiftyJSONVersionString[];
16 |
17 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwift/Pods-MVPSwift-umbrella.h:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
14 | FOUNDATION_EXPORT double Pods_MVPSwiftVersionNumber;
15 | FOUNDATION_EXPORT const unsigned char Pods_MVPSwiftVersionString[];
16 |
17 |
--------------------------------------------------------------------------------
/Podfile.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - Alamofire (5.6.0)
3 | - SwiftyJSON (5.0.1)
4 |
5 | DEPENDENCIES:
6 | - Alamofire
7 | - SwiftyJSON
8 |
9 | SPEC REPOS:
10 | trunk:
11 | - Alamofire
12 | - SwiftyJSON
13 |
14 | SPEC CHECKSUMS:
15 | Alamofire: 0c07058209f211e3d32824f8e0766d7c44ac83b3
16 | SwiftyJSON: 2f33a42c6fbc52764d96f13368585094bfd8aa5e
17 |
18 | PODFILE CHECKSUM: 53df4e2fa6a9e14cfc23eaa8f977facafef0c453
19 |
20 | COCOAPODS: 1.11.3
21 |
--------------------------------------------------------------------------------
/Pods/Manifest.lock:
--------------------------------------------------------------------------------
1 | PODS:
2 | - Alamofire (5.6.0)
3 | - SwiftyJSON (5.0.1)
4 |
5 | DEPENDENCIES:
6 | - Alamofire
7 | - SwiftyJSON
8 |
9 | SPEC REPOS:
10 | trunk:
11 | - Alamofire
12 | - SwiftyJSON
13 |
14 | SPEC CHECKSUMS:
15 | Alamofire: 0c07058209f211e3d32824f8e0766d7c44ac83b3
16 | SwiftyJSON: 2f33a42c6fbc52764d96f13368585094bfd8aa5e
17 |
18 | PODFILE CHECKSUM: 53df4e2fa6a9e14cfc23eaa8f977facafef0c453
19 |
20 | COCOAPODS: 1.11.3
21 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwiftTests/Pods-MVPSwiftTests-umbrella.h:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
14 | FOUNDATION_EXPORT double Pods_MVPSwiftTestsVersionNumber;
15 | FOUNDATION_EXPORT const unsigned char Pods_MVPSwiftTestsVersionString[];
16 |
17 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwiftUITests/Pods-MVPSwiftUITests-umbrella.h:
--------------------------------------------------------------------------------
1 | #ifdef __OBJC__
2 | #import
3 | #else
4 | #ifndef FOUNDATION_EXPORT
5 | #if defined(__cplusplus)
6 | #define FOUNDATION_EXPORT extern "C"
7 | #else
8 | #define FOUNDATION_EXPORT extern
9 | #endif
10 | #endif
11 | #endif
12 |
13 |
14 | FOUNDATION_EXPORT double Pods_MVPSwiftUITestsVersionNumber;
15 | FOUNDATION_EXPORT const unsigned char Pods_MVPSwiftUITestsVersionString[];
16 |
17 |
--------------------------------------------------------------------------------
/MVPSwift.xcodeproj/xcuserdata/nandawperdana.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | MVPSwift.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 5
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/Podfile:
--------------------------------------------------------------------------------
1 | # Uncomment the next line to define a global platform for your project
2 | # platform :ios, '9.0'
3 |
4 | target 'MVPSwift' do
5 | # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
6 | use_frameworks!
7 |
8 | # Pods for MVPSwift
9 | pod 'SwiftyJSON'
10 | pod 'Alamofire'
11 |
12 | target 'MVPSwiftTests' do
13 | inherit! :search_paths
14 | # Pods for testing
15 | end
16 |
17 | target 'MVPSwiftUITests' do
18 | inherit! :search_paths
19 | # Pods for testing
20 | end
21 |
22 | end
23 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Alamofire/Alamofire.xcconfig:
--------------------------------------------------------------------------------
1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Alamofire
2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
3 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
4 | PODS_BUILD_DIR = ${BUILD_DIR}
5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
6 | PODS_ROOT = ${SRCROOT}
7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/Alamofire
8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
9 | SKIP_INSTALL = YES
10 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
11 |
--------------------------------------------------------------------------------
/MVPSwift.xcodeproj/xcuserdata/nandawisnu.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | MVPSwift.xcscheme
8 |
9 | orderHint
10 | 5
11 |
12 | MVPSwift.xcscheme_^#shared#^_
13 |
14 | orderHint
15 | 5
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/SwiftyJSON/SwiftyJSON.xcconfig:
--------------------------------------------------------------------------------
1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SwiftyJSON
2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
3 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
4 | PODS_BUILD_DIR = ${BUILD_DIR}
5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
6 | PODS_ROOT = ${SRCROOT}
7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/SwiftyJSON
8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
9 | SKIP_INSTALL = YES
10 | SWIFT_VERSION = 3.0
11 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
12 |
--------------------------------------------------------------------------------
/MVPSwiftTests/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 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/MVPSwiftUITests/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 | CFBundleVersion
20 | 1
21 |
22 |
23 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/SwiftyJSON/SwiftyJSON.debug.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SwiftyJSON
3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
5 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
6 | PODS_BUILD_DIR = ${BUILD_DIR}
7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
8 | PODS_ROOT = ${SRCROOT}
9 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/SwiftyJSON
10 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
11 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
12 | SKIP_INSTALL = YES
13 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
14 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/SwiftyJSON/SwiftyJSON.release.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/SwiftyJSON
3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
5 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
6 | PODS_BUILD_DIR = ${BUILD_DIR}
7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
8 | PODS_ROOT = ${SRCROOT}
9 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/SwiftyJSON
10 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
11 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
12 | SKIP_INSTALL = YES
13 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
14 |
--------------------------------------------------------------------------------
/MVPSwift.xcodeproj/xcuserdata/NwP.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | MVPSwift.xcscheme
8 |
9 | orderHint
10 | 0
11 |
12 |
13 | SuppressBuildableAutocreation
14 |
15 | F32E0D871E2D15750068B4C5
16 |
17 | primary
18 |
19 |
20 | F32E0D9B1E2D15760068B4C5
21 |
22 | primary
23 |
24 |
25 | F32E0DA61E2D15760068B4C5
26 |
27 | primary
28 |
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Alamofire/Alamofire.debug.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Alamofire
3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
5 | OTHER_LDFLAGS = $(inherited) -framework "CFNetwork"
6 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
7 | PODS_BUILD_DIR = ${BUILD_DIR}
8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
9 | PODS_ROOT = ${SRCROOT}
10 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/Alamofire
11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
12 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
13 | SKIP_INSTALL = YES
14 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
15 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Alamofire/Alamofire.release.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Alamofire
3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
5 | OTHER_LDFLAGS = $(inherited) -framework "CFNetwork"
6 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
7 | PODS_BUILD_DIR = ${BUILD_DIR}
8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
9 | PODS_ROOT = ${SRCROOT}
10 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/Alamofire
11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
12 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
13 | SKIP_INSTALL = YES
14 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
15 |
--------------------------------------------------------------------------------
/MVPSwift/api/PeopleService.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PeopleService.swift
3 | // MVPSwift
4 | // The Interactor class, contains: API call for specific endpoint to be called in The Presenter;
5 | // local data storing logic.
6 | //
7 | // Created by Nanda w Perdana on 1/17/17.
8 | // Copyright © 2017 Nanda w Perdana. All rights reserved.
9 | //
10 |
11 | import Foundation
12 |
13 | class PeopleService {
14 | public func callAPIGetPeople(onSuccess successCallback: ((_ people: [People]) -> Void)?,
15 | onFailure failureCallback: ((_ errorMessage: String) -> Void)?) {
16 | APICallManager.instance.callAPIGetPeople(
17 | onSuccess: { (people) in
18 | successCallback?(people)
19 | },
20 | onFailure: { (errorMessage) in
21 | failureCallback?(errorMessage)
22 | }
23 | )
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # mvp-swift
2 | A sample project of iOS MVP architecture with Swift 3.
3 |
4 | ## PODS
5 | In this sample project includes some of useful pods for iOS, such as:
6 | - [Alamofire](https://github.com/Alamofire/Alamofire): Elegant HTTP Networking in Swift
7 | - [SwiftyJSON](https://github.com/SwiftyJSON/SwiftyJSON): The better way to deal with JSON data in Swift
8 |
9 | ## Sample API
10 | This project using sample API from [My Site](http://api.nandawperdana.com/people.json)
11 |
12 | 
13 |
14 | ## Links, Resources and References
15 | 1. https://blog.8thlight.com/uncle-bob/2012/08/13/the-clean-architecture.html
16 | 2. http://iyadagha.com/using-mvp-ios-swift/
17 | 3. http://clean-swift.com/clean-swift-ios-architecture/
18 | 4. https://www.smashingmagazine.com/2016/05/better-architecture-for-ios-apps-model-view-controller-pattern/
19 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwiftTests/Pods-MVPSwiftTests.debug.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyJSON"
3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyJSON/SwiftyJSON.framework/Headers"
5 | OTHER_LDFLAGS = $(inherited) -framework "Alamofire" -framework "CFNetwork" -framework "SwiftyJSON"
6 | PODS_BUILD_DIR = ${BUILD_DIR}
7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
9 | PODS_ROOT = ${SRCROOT}/Pods
10 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
11 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
12 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwiftTests/Pods-MVPSwiftTests.release.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyJSON"
3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyJSON/SwiftyJSON.framework/Headers"
5 | OTHER_LDFLAGS = $(inherited) -framework "Alamofire" -framework "CFNetwork" -framework "SwiftyJSON"
6 | PODS_BUILD_DIR = ${BUILD_DIR}
7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
9 | PODS_ROOT = ${SRCROOT}/Pods
10 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
11 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
12 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwiftUITests/Pods-MVPSwiftUITests.debug.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyJSON"
3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyJSON/SwiftyJSON.framework/Headers"
5 | OTHER_LDFLAGS = $(inherited) -framework "Alamofire" -framework "CFNetwork" -framework "SwiftyJSON"
6 | PODS_BUILD_DIR = ${BUILD_DIR}
7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
9 | PODS_ROOT = ${SRCROOT}/Pods
10 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
11 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
12 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwiftUITests/Pods-MVPSwiftUITests.release.xcconfig:
--------------------------------------------------------------------------------
1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyJSON"
3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyJSON/SwiftyJSON.framework/Headers"
5 | OTHER_LDFLAGS = $(inherited) -framework "Alamofire" -framework "CFNetwork" -framework "SwiftyJSON"
6 | PODS_BUILD_DIR = ${BUILD_DIR}
7 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
8 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
9 | PODS_ROOT = ${SRCROOT}/Pods
10 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
11 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
12 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Alamofire/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 | FMWK
17 | CFBundleShortVersionString
18 | 4.2.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/SwiftyJSON/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 | FMWK
17 | CFBundleShortVersionString
18 | 3.1.4
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwift/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 | FMWK
17 | CFBundleShortVersionString
18 | 1.0.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Alamofire/Alamofire-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 | FMWK
17 | CFBundleShortVersionString
18 | 5.6.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwiftTests/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 | FMWK
17 | CFBundleShortVersionString
18 | 1.0.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwiftUITests/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 | FMWK
17 | CFBundleShortVersionString
18 | 1.0.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/SwiftyJSON/SwiftyJSON-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 | FMWK
17 | CFBundleShortVersionString
18 | 5.0.1
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwift/Pods-MVPSwift-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 | FMWK
17 | CFBundleShortVersionString
18 | 1.0.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwiftTests/Pods-MVPSwiftTests-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 | FMWK
17 | CFBundleShortVersionString
18 | 1.0.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwiftTests/Pods-MVPSwiftTests-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 | Generated by CocoaPods - https://cocoapods.org
18 | Title
19 |
20 | Type
21 | PSGroupSpecifier
22 |
23 |
24 | StringsTable
25 | Acknowledgements
26 | Title
27 | Acknowledgements
28 |
29 |
30 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwiftUITests/Pods-MVPSwiftUITests-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 | FMWK
17 | CFBundleShortVersionString
18 | 1.0.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | ${CURRENT_PROJECT_VERSION}
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwiftUITests/Pods-MVPSwiftUITests-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 | Generated by CocoaPods - https://cocoapods.org
18 | Title
19 |
20 | Type
21 | PSGroupSpecifier
22 |
23 |
24 | StringsTable
25 | Acknowledgements
26 | Title
27 | Acknowledgements
28 |
29 |
30 |
--------------------------------------------------------------------------------
/MVPSwift/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "40x40",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "size" : "60x60",
36 | "scale" : "2x"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "size" : "60x60",
41 | "scale" : "3x"
42 | },
43 | {
44 | "idiom" : "ios-marketing",
45 | "size" : "1024x1024",
46 | "scale" : "1x"
47 | }
48 | ],
49 | "info" : {
50 | "version" : 1,
51 | "author" : "xcode"
52 | }
53 | }
--------------------------------------------------------------------------------
/MVPSwiftTests/MVPSwiftTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MVPSwiftTests.swift
3 | // MVPSwiftTests
4 | //
5 | // Created by Nanda w Perdana on 1/16/17.
6 | // Copyright © 2017 Nanda w Perdana. All rights reserved.
7 | //
8 |
9 | import XCTest
10 | @testable import MVPSwift
11 |
12 | class MVPSwiftTests: XCTestCase {
13 |
14 | override func setUp() {
15 | super.setUp()
16 | // Put setup code here. This method is called before the invocation of each test method in the class.
17 | }
18 |
19 | override func tearDown() {
20 | // Put teardown code here. This method is called after the invocation of each test method in the class.
21 | super.tearDown()
22 | }
23 |
24 | func testExample() {
25 | // This is an example of a functional test case.
26 | // Use XCTAssert and related functions to verify your tests produce the correct results.
27 | }
28 |
29 | func testPerformanceExample() {
30 | // This is an example of a performance test case.
31 | self.measure {
32 | // Put the code you want to measure the time of here.
33 | }
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/Pods/SwiftyJSON/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2017 Ruoyu Fu
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in
13 | all copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | THE SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Pods/Alamofire/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright (c) 2014-2022 Alamofire Software Foundation (http://alamofire.org/)
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 |
--------------------------------------------------------------------------------
/MVPSwift/presentation/view/PeopleAdapter.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PeopleAdapter.swift
3 | // MVPSwift
4 | //
5 | // Created by Nanda Wisnu Tampan on 05/02/21.
6 | // Copyright © 2021 Nanda w Perdana. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | protocol PeopleAdapterDelegate: AnyObject {
12 | func didTap(_ item: People)
13 | }
14 |
15 | class PeopleAdapter: NSObject, UITableViewDelegate, UITableViewDataSource {
16 | let identifier = "PeopleInfoCell"
17 |
18 | var list: [People]?
19 |
20 | weak var delegate: PeopleAdapterDelegate?
21 |
22 | func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
23 | return list?.count ?? 0
24 | }
25 |
26 | func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
27 | let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath) as! PeopleCell
28 | cell.item = list?[indexPath.row]
29 | return cell
30 | }
31 |
32 | func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
33 | guard let item = list?[indexPath.row] else { return }
34 | delegate?.didTap(item)
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwift/Pods-MVPSwift.debug.xcconfig:
--------------------------------------------------------------------------------
1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
2 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyJSON"
4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
5 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyJSON/SwiftyJSON.framework/Headers"
6 | LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks'
7 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
8 | OTHER_LDFLAGS = $(inherited) -framework "Alamofire" -framework "CFNetwork" -framework "SwiftyJSON"
9 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
10 | PODS_BUILD_DIR = ${BUILD_DIR}
11 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
12 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
13 | PODS_ROOT = ${SRCROOT}/Pods
14 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
16 |
--------------------------------------------------------------------------------
/Pods/Pods.xcodeproj/xcuserdata/nandawisnu.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | Alamofire.xcscheme
8 |
9 | isShown
10 |
11 | orderHint
12 | 0
13 |
14 | Pods-MVPSwift.xcscheme
15 |
16 | isShown
17 |
18 | orderHint
19 | 1
20 |
21 | Pods-MVPSwiftTests.xcscheme
22 |
23 | isShown
24 |
25 | orderHint
26 | 2
27 |
28 | Pods-MVPSwiftUITests.xcscheme
29 |
30 | isShown
31 |
32 | orderHint
33 | 3
34 |
35 | SwiftyJSON.xcscheme
36 |
37 | isShown
38 |
39 | orderHint
40 | 4
41 |
42 |
43 | SuppressBuildableAutocreation
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwift/Pods-MVPSwift.release.xcconfig:
--------------------------------------------------------------------------------
1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
2 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyJSON"
4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
5 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Alamofire/Alamofire.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SwiftyJSON/SwiftyJSON.framework/Headers"
6 | LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks'
7 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift
8 | OTHER_LDFLAGS = $(inherited) -framework "Alamofire" -framework "CFNetwork" -framework "SwiftyJSON"
9 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS
10 | PODS_BUILD_DIR = ${BUILD_DIR}
11 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
12 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
13 | PODS_ROOT = ${SRCROOT}/Pods
14 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES
16 |
--------------------------------------------------------------------------------
/Pods/Pods.xcodeproj/xcuserdata/nandawperdana.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | Alamofire.xcscheme
8 |
9 | isShown
10 |
11 | orderHint
12 | 0
13 |
14 | Pods-MVPSwift.xcscheme
15 |
16 | isShown
17 |
18 | orderHint
19 | 1
20 |
21 | Pods-MVPSwiftTests.xcscheme
22 |
23 | isShown
24 |
25 | orderHint
26 | 2
27 |
28 | Pods-MVPSwiftUITests.xcscheme
29 |
30 | isShown
31 |
32 | orderHint
33 | 3
34 |
35 | SwiftyJSON.xcscheme
36 |
37 | isShown
38 |
39 | orderHint
40 | 4
41 |
42 |
43 | SuppressBuildableAutocreation
44 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/MVPSwift/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 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | NSAppTransportSecurity
24 |
25 | NSAllowsArbitraryLoads
26 |
27 |
28 | UILaunchStoryboardName
29 | LaunchScreen
30 | UIRequiredDeviceCapabilities
31 |
32 | armv7
33 |
34 | UISupportedInterfaceOrientations
35 |
36 | UIInterfaceOrientationPortrait
37 | UIInterfaceOrientationLandscapeLeft
38 | UIInterfaceOrientationLandscapeRight
39 |
40 |
41 |
42 |
--------------------------------------------------------------------------------
/MVPSwiftUITests/MVPSwiftUITests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MVPSwiftUITests.swift
3 | // MVPSwiftUITests
4 | //
5 | // Created by Nanda w Perdana on 1/16/17.
6 | // Copyright © 2017 Nanda w Perdana. All rights reserved.
7 | //
8 |
9 | import XCTest
10 |
11 | class MVPSwiftUITests: XCTestCase {
12 |
13 | override func setUp() {
14 | super.setUp()
15 |
16 | // Put setup code here. This method is called before the invocation of each test method in the class.
17 |
18 | // In UI tests it is usually best to stop immediately when a failure occurs.
19 | continueAfterFailure = false
20 | // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.
21 | XCUIApplication().launch()
22 |
23 | // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
24 | }
25 |
26 | override func tearDown() {
27 | // Put teardown code here. This method is called after the invocation of each test method in the class.
28 | super.tearDown()
29 | }
30 |
31 | func testExample() {
32 | // Use recording to get started writing UI tests.
33 | // Use XCTAssert and related functions to verify your tests produce the correct results.
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/Pods/Pods.xcodeproj/xcuserdata/NwP.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | Alamofire.xcscheme
8 |
9 | isShown
10 |
11 |
12 | Pods-MVPSwift.xcscheme
13 |
14 | isShown
15 |
16 |
17 | Pods-MVPSwiftTests.xcscheme
18 |
19 | isShown
20 |
21 |
22 | Pods-MVPSwiftUITests.xcscheme
23 |
24 | isShown
25 |
26 |
27 | SwiftyJSON.xcscheme
28 |
29 | isShown
30 |
31 |
32 |
33 | SuppressBuildableAutocreation
34 |
35 | 322518320AC6346F9A831DFC8D0C380A
36 |
37 | primary
38 |
39 |
40 | 4840CC355F56F676F453B62397415BDA
41 |
42 | primary
43 |
44 |
45 | 736E20D020A8363133BB847E80ABDC27
46 |
47 | primary
48 |
49 |
50 | 88E9EC28B8B46C3631E6B242B50F4442
51 |
52 | primary
53 |
54 |
55 | A60865C22CA627B61BBD32A73F6A8109
56 |
57 | primary
58 |
59 |
60 |
61 |
62 |
63 |
--------------------------------------------------------------------------------
/MVPSwift/presentation/presenter/PeoplePresenter.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PeoplePresenter.swift
3 | // MVPSwift
4 | // The ViewController's presenter, contains:
5 | // - View: The ViewController's contract.
6 | // - Presenter: The ViewController's main logic (call API, populate data, show data, etc.)
7 | //
8 | // Created by Nanda w Perdana on 1/17/17.
9 | // Copyright © 2017 Nanda w Perdana. All rights reserved.
10 | //
11 |
12 | import UIKit
13 |
14 | protocol PeopleView: NSObjectProtocol {
15 | func showToast(message: String, duration: Double)
16 | func startLoading()
17 | func finishLoading()
18 | func setPeople(people: [People])
19 | func setEmptyPeople()
20 | }
21 |
22 | class PeoplePresenter {
23 | private let peopleService: PeopleService
24 | weak private var peopleView: PeopleView?
25 |
26 | init(peopleService: PeopleService) {
27 | self.peopleService = peopleService
28 | }
29 |
30 | func attachView(view: PeopleView) {
31 | peopleView = view
32 | }
33 |
34 | func detachView() {
35 | peopleView = nil
36 | }
37 |
38 | func getPeople() {
39 | peopleView?.startLoading()
40 | peopleService.callAPIGetPeople(
41 | onSuccess: { [weak self] people in
42 | guard let ws = self else { return }
43 | ws.peopleView?.finishLoading()
44 | if (people.count == 0){
45 | ws.peopleView?.setEmptyPeople()
46 | } else {
47 | ws.peopleView?.setPeople(people: people)
48 | }
49 | },
50 | onFailure: { [weak self] errorMessage in
51 | self?.peopleView?.finishLoading()
52 | }
53 | )
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/Pods/Alamofire/Source/DispatchQueue+Alamofire.swift:
--------------------------------------------------------------------------------
1 | //
2 | // DispatchQueue+Alamofire.swift
3 | //
4 | // Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 | //
6 | // Permission is hereby granted, free of charge, to any person obtaining a copy
7 | // of this software and associated documentation files (the "Software"), to deal
8 | // in the Software without restriction, including without limitation the rights
9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | // copies of the Software, and to permit persons to whom the Software is
11 | // furnished to do so, subject to the following conditions:
12 | //
13 | // The above copyright notice and this permission notice shall be included in
14 | // all copies or substantial portions of the Software.
15 | //
16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | // THE SOFTWARE.
23 | //
24 |
25 | import Dispatch
26 | import Foundation
27 |
28 | extension DispatchQueue {
29 | /// Execute the provided closure after a `TimeInterval`.
30 | ///
31 | /// - Parameters:
32 | /// - delay: `TimeInterval` to delay execution.
33 | /// - closure: Closure to execute.
34 | func after(_ delay: TimeInterval, execute closure: @escaping () -> Void) {
35 | asyncAfter(deadline: .now() + delay, execute: closure)
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/Pods/Alamofire/Source/Alamofire.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Alamofire.swift
3 | //
4 | // Copyright (c) 2014-2021 Alamofire Software Foundation (http://alamofire.org/)
5 | //
6 | // Permission is hereby granted, free of charge, to any person obtaining a copy
7 | // of this software and associated documentation files (the "Software"), to deal
8 | // in the Software without restriction, including without limitation the rights
9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | // copies of the Software, and to permit persons to whom the Software is
11 | // furnished to do so, subject to the following conditions:
12 | //
13 | // The above copyright notice and this permission notice shall be included in
14 | // all copies or substantial portions of the Software.
15 | //
16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | // THE SOFTWARE.
23 | //
24 |
25 | import Dispatch
26 | import Foundation
27 | #if canImport(FoundationNetworking)
28 | @_exported import FoundationNetworking
29 | #endif
30 |
31 | #if swift(<5.3)
32 | #error("Alamofire doesn't support Swift versions below 5.3")
33 | #endif
34 |
35 | /// Reference to `Session.default` for quick bootstrapping and examples.
36 | public let AF = Session.default
37 |
38 | /// Current Alamofire version. Necessary since SPM doesn't use dynamic libraries. Plus this will be more accurate.
39 | let version = "5.6.0"
40 |
--------------------------------------------------------------------------------
/Pods/Alamofire/Source/URLRequest+Alamofire.swift:
--------------------------------------------------------------------------------
1 | //
2 | // URLRequest+Alamofire.swift
3 | //
4 | // Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.org/)
5 | //
6 | // Permission is hereby granted, free of charge, to any person obtaining a copy
7 | // of this software and associated documentation files (the "Software"), to deal
8 | // in the Software without restriction, including without limitation the rights
9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | // copies of the Software, and to permit persons to whom the Software is
11 | // furnished to do so, subject to the following conditions:
12 | //
13 | // The above copyright notice and this permission notice shall be included in
14 | // all copies or substantial portions of the Software.
15 | //
16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | // THE SOFTWARE.
23 | //
24 |
25 | import Foundation
26 |
27 | extension URLRequest {
28 | /// Returns the `httpMethod` as Alamofire's `HTTPMethod` type.
29 | public var method: HTTPMethod? {
30 | get { httpMethod.flatMap(HTTPMethod.init) }
31 | set { httpMethod = newValue?.rawValue }
32 | }
33 |
34 | public func validate() throws {
35 | if method == .get, let bodyData = httpBody {
36 | throw AFError.urlRequestValidationFailed(reason: .bodyDataInGETRequest(bodyData))
37 | }
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/MVPSwift/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/MVPSwift/model/People.swift:
--------------------------------------------------------------------------------
1 | //
2 | // People.swift
3 | // MVPSwift
4 | // Model Class
5 | //
6 | // Created by Nanda w Perdana on 1/16/17.
7 | // Copyright © 2017 Nanda w Perdana. All rights reserved.
8 | //
9 |
10 | import Foundation
11 |
12 | class People {
13 | var id: String?
14 | var name: String?
15 | var email: String?
16 | var address: String?
17 | var gender: String?
18 | var pic: String?
19 | var phone: Phone?
20 |
21 | // MARK: Instance Method
22 | func loadFromDictionary(_ dict: [String: AnyObject]) {
23 | if let data = dict["id"] as? String {
24 | self.id = data
25 | }
26 | if let data = dict["name"] as? String {
27 | self.name = data
28 | }
29 | if let data = dict["email"] as? String {
30 | self.email = data
31 | }
32 | if let data = dict["address"] as? String {
33 | self.address = data
34 | }
35 | if let data = dict["gender"] as? String {
36 | self.gender = data
37 | }
38 | if let data = dict["pic"] as? String {
39 | self.pic = data
40 | }
41 | if let data = dict["phone"] as? [String:AnyObject] {
42 | self.phone = Phone.build(data)
43 | }
44 | }
45 |
46 | // MARK: Class Method
47 | class func build(_ dict: [String: AnyObject]) -> People {
48 | let contact = People()
49 | contact.loadFromDictionary(dict)
50 | return contact
51 | }
52 | }
53 |
54 | class Phone {
55 | var mobile: String?
56 | var home: String?
57 | var office: String?
58 |
59 | // MARK: Instance Method
60 | func loadFromDictionary(_ dict: [String: AnyObject]) {
61 | if let data = dict["mobile"] as? String {
62 | self.mobile = data
63 | }
64 | if let data = dict["home"] as? String {
65 | self.home = data
66 | }
67 | if let data = dict["office"] as? String {
68 | self.office = data
69 | }
70 | }
71 |
72 | // MARK: Class Method
73 | class func build(_ dict: [String: AnyObject]) -> Phone {
74 | let phone = Phone()
75 | phone.loadFromDictionary(dict)
76 | return phone
77 | }
78 | }
79 |
--------------------------------------------------------------------------------
/Pods/Alamofire/Source/URLSessionConfiguration+Alamofire.swift:
--------------------------------------------------------------------------------
1 | //
2 | // URLSessionConfiguration+Alamofire.swift
3 | //
4 | // Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 | //
6 | // Permission is hereby granted, free of charge, to any person obtaining a copy
7 | // of this software and associated documentation files (the "Software"), to deal
8 | // in the Software without restriction, including without limitation the rights
9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | // copies of the Software, and to permit persons to whom the Software is
11 | // furnished to do so, subject to the following conditions:
12 | //
13 | // The above copyright notice and this permission notice shall be included in
14 | // all copies or substantial portions of the Software.
15 | //
16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | // THE SOFTWARE.
23 | //
24 |
25 | import Foundation
26 |
27 | extension URLSessionConfiguration: AlamofireExtended {}
28 | extension AlamofireExtension where ExtendedType: URLSessionConfiguration {
29 | /// Alamofire's default configuration. Same as `URLSessionConfiguration.default` but adds Alamofire default
30 | /// `Accept-Language`, `Accept-Encoding`, and `User-Agent` headers.
31 | public static var `default`: URLSessionConfiguration {
32 | let configuration = URLSessionConfiguration.default
33 | configuration.headers = .default
34 |
35 | return configuration
36 | }
37 |
38 | /// `.ephemeral` configuration with Alamofire's default `Accept-Language`, `Accept-Encoding`, and `User-Agent`
39 | /// headers.
40 | public static var ephemeral: URLSessionConfiguration {
41 | let configuration = URLSessionConfiguration.ephemeral
42 | configuration.headers = .default
43 |
44 | return configuration
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/Pods/Pods.xcodeproj/xcuserdata/nandawperdana.xcuserdatad/xcschemes/Alamofire.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
50 |
51 |
53 |
54 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/Pods/Pods.xcodeproj/xcuserdata/nandawperdana.xcuserdatad/xcschemes/SwiftyJSON.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
50 |
51 |
53 |
54 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/Pods/Pods.xcodeproj/xcuserdata/nandawisnu.xcuserdatad/xcschemes/Pods-MVPSwift.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
50 |
51 |
53 |
54 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/Pods/Pods.xcodeproj/xcuserdata/nandawperdana.xcuserdatad/xcschemes/Pods-MVPSwift.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
50 |
51 |
53 |
54 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/Pods/Pods.xcodeproj/xcuserdata/nandawisnu.xcuserdatad/xcschemes/Pods-MVPSwiftTests.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
50 |
51 |
53 |
54 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/Pods/Pods.xcodeproj/xcuserdata/nandawisnu.xcuserdatad/xcschemes/Pods-MVPSwiftUITests.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
50 |
51 |
53 |
54 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/Pods/Pods.xcodeproj/xcuserdata/nandawperdana.xcuserdatad/xcschemes/Pods-MVPSwiftTests.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
50 |
51 |
53 |
54 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/Pods/Pods.xcodeproj/xcuserdata/nandawperdana.xcuserdatad/xcschemes/Pods-MVPSwiftUITests.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
50 |
51 |
53 |
54 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/Pods/Pods.xcodeproj/xcuserdata/NwP.xcuserdatad/xcschemes/Alamofire.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
45 |
46 |
52 |
53 |
55 |
56 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/Pods/Alamofire/Source/StringEncoding+Alamofire.swift:
--------------------------------------------------------------------------------
1 | //
2 | // StringEncoding+Alamofire.swift
3 | //
4 | // Copyright (c) 2020 Alamofire Software Foundation (http://alamofire.org/)
5 | //
6 | // Permission is hereby granted, free of charge, to any person obtaining a copy
7 | // of this software and associated documentation files (the "Software"), to deal
8 | // in the Software without restriction, including without limitation the rights
9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | // copies of the Software, and to permit persons to whom the Software is
11 | // furnished to do so, subject to the following conditions:
12 | //
13 | // The above copyright notice and this permission notice shall be included in
14 | // all copies or substantial portions of the Software.
15 | //
16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | // THE SOFTWARE.
23 | //
24 |
25 | import Foundation
26 |
27 | extension String.Encoding {
28 | /// Creates an encoding from the IANA charset name.
29 | ///
30 | /// - Notes: These mappings match those [provided by CoreFoundation](https://opensource.apple.com/source/CF/CF-476.18/CFStringUtilities.c.auto.html)
31 | ///
32 | /// - Parameter name: IANA charset name.
33 | init?(ianaCharsetName name: String) {
34 | switch name.lowercased() {
35 | case "utf-8":
36 | self = .utf8
37 | case "iso-8859-1":
38 | self = .isoLatin1
39 | case "unicode-1-1", "iso-10646-ucs-2", "utf-16":
40 | self = .utf16
41 | case "utf-16be":
42 | self = .utf16BigEndian
43 | case "utf-16le":
44 | self = .utf16LittleEndian
45 | case "utf-32":
46 | self = .utf32
47 | case "utf-32be":
48 | self = .utf32BigEndian
49 | case "utf-32le":
50 | self = .utf32LittleEndian
51 | default:
52 | return nil
53 | }
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/Pods/Pods.xcodeproj/xcuserdata/NwP.xcuserdatad/xcschemes/SwiftyJSON.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
45 |
46 |
52 |
53 |
55 |
56 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/Pods/Pods.xcodeproj/xcuserdata/nandawisnu.xcuserdatad/xcschemes/Alamofire.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
45 |
46 |
52 |
53 |
55 |
56 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/Pods/Pods.xcodeproj/xcuserdata/nandawisnu.xcuserdatad/xcschemes/SwiftyJSON.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
45 |
46 |
52 |
53 |
55 |
56 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwift/Pods-MVPSwift-acknowledgements.markdown:
--------------------------------------------------------------------------------
1 | # Acknowledgements
2 | This application makes use of the following third party libraries:
3 |
4 | ## Alamofire
5 |
6 | Copyright (c) 2014-2022 Alamofire Software Foundation (http://alamofire.org/)
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 |
27 | ## SwiftyJSON
28 |
29 | The MIT License (MIT)
30 |
31 | Copyright (c) 2017 Ruoyu Fu
32 |
33 | Permission is hereby granted, free of charge, to any person obtaining a copy
34 | of this software and associated documentation files (the "Software"), to deal
35 | in the Software without restriction, including without limitation the rights
36 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
37 | copies of the Software, and to permit persons to whom the Software is
38 | furnished to do so, subject to the following conditions:
39 |
40 | The above copyright notice and this permission notice shall be included in
41 | all copies or substantial portions of the Software.
42 |
43 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
44 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
45 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
46 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
47 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
48 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
49 | THE SOFTWARE.
50 |
51 | Generated by CocoaPods - https://cocoapods.org
52 |
--------------------------------------------------------------------------------
/MVPSwift/presentation/view/PeopleCell.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PeopleCell.swift
3 | // MVPSwift
4 | //
5 | // Created by Nanda Wisnu Perdana on 05/02/21.
6 | // Copyright © 2021 Nanda w Perdana. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | class PeopleCell: UITableViewCell {
12 | let labelName: UILabel = {
13 | let view = UILabel()
14 | view.textColor = .black
15 | view.font = UIFont.boldSystemFont(ofSize: 16)
16 | view.textAlignment = .left
17 | view.numberOfLines = 0
18 | view.translatesAutoresizingMaskIntoConstraints = false
19 |
20 | return view
21 | }()
22 |
23 | let labelEmail: UILabel = {
24 | let view = UILabel()
25 | view.textColor = .black
26 | view.font = UIFont.boldSystemFont(ofSize: 14)
27 | view.textAlignment = .left
28 | view.numberOfLines = 0
29 | view.translatesAutoresizingMaskIntoConstraints = false
30 |
31 | return view
32 | }()
33 |
34 | var item: People? {
35 | didSet {
36 | guard let item = item else { return }
37 | setItem(item)
38 | }
39 | }
40 |
41 | override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
42 | super.init(style: style, reuseIdentifier: reuseIdentifier)
43 | backgroundColor = .white
44 | selectionStyle = .gray
45 |
46 | contentView.addSubview(labelName)
47 | contentView.addSubview(labelEmail)
48 |
49 | let padding: CGFloat = 10
50 | NSLayoutConstraint.activate([
51 | labelName.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: padding),
52 | labelName.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -padding),
53 | labelName.topAnchor.constraint(equalTo: contentView.topAnchor, constant: padding),
54 |
55 | labelEmail.leadingAnchor.constraint(equalTo: labelName.leadingAnchor),
56 | labelEmail.trailingAnchor.constraint(equalTo: labelName.trailingAnchor),
57 | labelEmail.topAnchor.constraint(equalTo: labelName.bottomAnchor, constant: padding),
58 |
59 | contentView.bottomAnchor.constraint(greaterThanOrEqualTo: labelEmail.bottomAnchor, constant: padding)
60 | ])
61 | }
62 |
63 | required init?(coder: NSCoder) {
64 | fatalError("init(coder:) has not been implemented")
65 | }
66 |
67 | private func setItem(_ item: People) {
68 | labelName.text = item.name
69 | labelEmail.text = item.email
70 | }
71 | }
72 |
--------------------------------------------------------------------------------
/Pods/Alamofire/Source/AlamofireExtended.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AlamofireExtended.swift
3 | //
4 | // Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.org/)
5 | //
6 | // Permission is hereby granted, free of charge, to any person obtaining a copy
7 | // of this software and associated documentation files (the "Software"), to deal
8 | // in the Software without restriction, including without limitation the rights
9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | // copies of the Software, and to permit persons to whom the Software is
11 | // furnished to do so, subject to the following conditions:
12 | //
13 | // The above copyright notice and this permission notice shall be included in
14 | // all copies or substantial portions of the Software.
15 | //
16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | // THE SOFTWARE.
23 | //
24 |
25 | /// Type that acts as a generic extension point for all `AlamofireExtended` types.
26 | public struct AlamofireExtension {
27 | /// Stores the type or meta-type of any extended type.
28 | public private(set) var type: ExtendedType
29 |
30 | /// Create an instance from the provided value.
31 | ///
32 | /// - Parameter type: Instance being extended.
33 | public init(_ type: ExtendedType) {
34 | self.type = type
35 | }
36 | }
37 |
38 | /// Protocol describing the `af` extension points for Alamofire extended types.
39 | public protocol AlamofireExtended {
40 | /// Type being extended.
41 | associatedtype ExtendedType
42 |
43 | /// Static Alamofire extension point.
44 | static var af: AlamofireExtension.Type { get set }
45 | /// Instance Alamofire extension point.
46 | var af: AlamofireExtension { get set }
47 | }
48 |
49 | extension AlamofireExtended {
50 | /// Static Alamofire extension point.
51 | public static var af: AlamofireExtension.Type {
52 | get { AlamofireExtension.self }
53 | set {}
54 | }
55 |
56 | /// Instance Alamofire extension point.
57 | public var af: AlamofireExtension {
58 | get { AlamofireExtension(self) }
59 | set {}
60 | }
61 | }
62 |
--------------------------------------------------------------------------------
/Pods/Alamofire/Source/HTTPMethod.swift:
--------------------------------------------------------------------------------
1 | //
2 | // HTTPMethod.swift
3 | //
4 | // Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 | //
6 | // Permission is hereby granted, free of charge, to any person obtaining a copy
7 | // of this software and associated documentation files (the "Software"), to deal
8 | // in the Software without restriction, including without limitation the rights
9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | // copies of the Software, and to permit persons to whom the Software is
11 | // furnished to do so, subject to the following conditions:
12 | //
13 | // The above copyright notice and this permission notice shall be included in
14 | // all copies or substantial portions of the Software.
15 | //
16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | // THE SOFTWARE.
23 | //
24 |
25 | /// Type representing HTTP methods. Raw `String` value is stored and compared case-sensitively, so
26 | /// `HTTPMethod.get != HTTPMethod(rawValue: "get")`.
27 | ///
28 | /// See https://tools.ietf.org/html/rfc7231#section-4.3
29 | public struct HTTPMethod: RawRepresentable, Equatable, Hashable {
30 | /// `CONNECT` method.
31 | public static let connect = HTTPMethod(rawValue: "CONNECT")
32 | /// `DELETE` method.
33 | public static let delete = HTTPMethod(rawValue: "DELETE")
34 | /// `GET` method.
35 | public static let get = HTTPMethod(rawValue: "GET")
36 | /// `HEAD` method.
37 | public static let head = HTTPMethod(rawValue: "HEAD")
38 | /// `OPTIONS` method.
39 | public static let options = HTTPMethod(rawValue: "OPTIONS")
40 | /// `PATCH` method.
41 | public static let patch = HTTPMethod(rawValue: "PATCH")
42 | /// `POST` method.
43 | public static let post = HTTPMethod(rawValue: "POST")
44 | /// `PUT` method.
45 | public static let put = HTTPMethod(rawValue: "PUT")
46 | /// `QUERY` method.
47 | public static let query = HTTPMethod(rawValue: "QUERY")
48 | /// `TRACE` method.
49 | public static let trace = HTTPMethod(rawValue: "TRACE")
50 |
51 | public let rawValue: String
52 |
53 | public init(rawValue: String) {
54 | self.rawValue = rawValue
55 | }
56 | }
57 |
--------------------------------------------------------------------------------
/Pods/Alamofire/Source/OperationQueue+Alamofire.swift:
--------------------------------------------------------------------------------
1 | //
2 | // OperationQueue+Alamofire.swift
3 | //
4 | // Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 | //
6 | // Permission is hereby granted, free of charge, to any person obtaining a copy
7 | // of this software and associated documentation files (the "Software"), to deal
8 | // in the Software without restriction, including without limitation the rights
9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | // copies of the Software, and to permit persons to whom the Software is
11 | // furnished to do so, subject to the following conditions:
12 | //
13 | // The above copyright notice and this permission notice shall be included in
14 | // all copies or substantial portions of the Software.
15 | //
16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | // THE SOFTWARE.
23 | //
24 |
25 | import Foundation
26 |
27 | extension OperationQueue {
28 | /// Creates an instance using the provided parameters.
29 | ///
30 | /// - Parameters:
31 | /// - qualityOfService: `QualityOfService` to be applied to the queue. `.default` by default.
32 | /// - maxConcurrentOperationCount: Maximum concurrent operations.
33 | /// `OperationQueue.defaultMaxConcurrentOperationCount` by default.
34 | /// - underlyingQueue: Underlying `DispatchQueue`. `nil` by default.
35 | /// - name: Name for the queue. `nil` by default.
36 | /// - startSuspended: Whether the queue starts suspended. `false` by default.
37 | convenience init(qualityOfService: QualityOfService = .default,
38 | maxConcurrentOperationCount: Int = OperationQueue.defaultMaxConcurrentOperationCount,
39 | underlyingQueue: DispatchQueue? = nil,
40 | name: String? = nil,
41 | startSuspended: Bool = false) {
42 | self.init()
43 | self.qualityOfService = qualityOfService
44 | self.maxConcurrentOperationCount = maxConcurrentOperationCount
45 | self.underlyingQueue = underlyingQueue
46 | self.name = name
47 | isSuspended = startSuspended
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/Pods/Pods.xcodeproj/xcuserdata/NwP.xcuserdatad/xcschemes/Pods-MVPSwift.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 |
66 |
67 |
70 |
71 |
72 |
--------------------------------------------------------------------------------
/Pods/Pods.xcodeproj/xcuserdata/NwP.xcuserdatad/xcschemes/Pods-MVPSwiftTests.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 |
66 |
67 |
70 |
71 |
72 |
--------------------------------------------------------------------------------
/Pods/Pods.xcodeproj/xcuserdata/NwP.xcuserdatad/xcschemes/Pods-MVPSwiftUITests.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 |
66 |
67 |
70 |
71 |
72 |
--------------------------------------------------------------------------------
/MVPSwift/api/APICallManager.swift:
--------------------------------------------------------------------------------
1 | //
2 | // APICallManager.swift
3 | // MVPSwift
4 | // Populate all API caller methods.
5 | //
6 | // Created by Nanda w Perdana on 1/16/17.
7 | // Copyright © 2017 Nanda w Perdana. All rights reserved.
8 | //
9 |
10 | import Alamofire
11 | import SwiftyJSON
12 | import Foundation
13 |
14 | let API_BASE_URL = "https://nandawperdana.com"
15 |
16 | class APICallManager {
17 | static let instance = APICallManager()
18 |
19 | enum RequestMethod {
20 | case get
21 | case post
22 | }
23 |
24 | enum Endpoint: String {
25 | case People = "/people.json"
26 | }
27 |
28 | // MARK: People API
29 | func callAPIGetPeople(onSuccess successCallback: ((_ people: [People]) -> Void)?,
30 | onFailure failureCallback: ((_ errorMessage: String) -> Void)?) {
31 |
32 | // Build URL
33 | let url = API_BASE_URL + Endpoint.People.rawValue
34 |
35 | // call API
36 | self.createRequest(
37 | url, method: .get, headers: nil, parameters: nil,
38 | onSuccess: {(responseObject: JSON) -> Void in
39 | // Create dictionary
40 | if let responseDict = responseObject["data"].arrayObject {
41 | let peopleDict = responseDict as! [[String:AnyObject]]
42 |
43 | // Create object
44 | var data = [People]()
45 | for item in peopleDict {
46 | let single = People.build(item)
47 | data.append(single)
48 | }
49 |
50 | // Fire callback
51 | successCallback?(data)
52 | } else {
53 | failureCallback?("An error has occured.")
54 | }
55 | },
56 | onFailure: {(errorMessage: String) -> Void in
57 | failureCallback?(errorMessage)
58 | }
59 | )
60 | }
61 |
62 | // MARK: Request Handler
63 | // Create request
64 | func createRequest(
65 | _ url: String,
66 | method: HTTPMethod,
67 | headers: [String: String]?,
68 | parameters: AnyObject?,
69 | onSuccess successCallback: ((JSON) -> Void)?,
70 | onFailure failureCallback: ((String) -> Void)?
71 | ) {
72 |
73 | AF.request(url, method: method).response { response in
74 | switch response.result {
75 | case .success(let value):
76 | let json = JSON(value as Any)
77 | successCallback?(json)
78 | case .failure(let error):
79 | if let callback = failureCallback {
80 | // Return
81 | callback(error.localizedDescription)
82 | }
83 | }
84 | }
85 | }
86 | }
87 |
--------------------------------------------------------------------------------
/MVPSwift/presentation/view/PeopleViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // PeopleViewController.swift
3 | // MVPSwift
4 | // The App Main ViewController (has only one presenter).
5 | //
6 | // Created by Nanda w Perdana on 1/17/17.
7 | // Copyright © 2017 Nanda w Perdana. All rights reserved.
8 | //
9 |
10 | import UIKit
11 |
12 | class PeopleViewController: UIViewController {
13 | let adapter = PeopleAdapter()
14 |
15 | lazy var listView: UITableView = {
16 | let view = UITableView()
17 | view.showsHorizontalScrollIndicator = false
18 | view.showsVerticalScrollIndicator = true
19 | view.translatesAutoresizingMaskIntoConstraints = false
20 | view.delegate = adapter.self
21 | view.dataSource = adapter
22 | view.separatorStyle = .singleLine
23 | view.contentInset = UIEdgeInsets(top: 10, left: 0, bottom: 10, right: 0)
24 | view.rowHeight = UITableView.automaticDimension
25 | view.estimatedRowHeight = 100
26 | view.backgroundColor = .white
27 | view.register(PeopleCell.self, forCellReuseIdentifier: adapter.identifier)
28 |
29 | return view
30 | }()
31 |
32 | var safeArea: UILayoutGuide!
33 |
34 | let presenter = PeoplePresenter(peopleService: PeopleService())
35 |
36 | override func viewDidLoad() {
37 | super.viewDidLoad()
38 | presenter.attachView(view: self)
39 | adapter.delegate = self
40 |
41 | view.backgroundColor = .clear
42 | safeArea = view.layoutMarginsGuide
43 |
44 | view.addSubview(listView)
45 |
46 | NSLayoutConstraint.activate([
47 | listView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
48 | listView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
49 | listView.leftAnchor.constraint(equalTo: view.leftAnchor),
50 | listView.rightAnchor.constraint(equalTo: view.rightAnchor),
51 | listView.topAnchor.constraint(equalTo: safeArea.topAnchor),
52 | listView.bottomAnchor.constraint(equalTo: safeArea.bottomAnchor)
53 | ])
54 |
55 | // load data
56 | presenter.getPeople()
57 | }
58 |
59 | override func didReceiveMemoryWarning() {
60 | super.didReceiveMemoryWarning()
61 | // Dispose of any resources that can be recreated.
62 | }
63 | }
64 |
65 | extension PeopleViewController: PeopleAdapterDelegate {
66 | func didTap(_ item: People) {
67 | guard let name = item.name else { return }
68 | showToast(message: "Name: \(name)")
69 | }
70 | }
71 |
72 | extension PeopleViewController: PeopleView {
73 | func showToast(message: String, duration: Double = 1) {
74 | let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert)
75 | alert.view.backgroundColor = .black
76 | alert.view.alpha = 0.6
77 | alert.view.layer.cornerRadius = 15
78 |
79 | self.present(alert, animated: false)
80 |
81 | DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + duration) {
82 | alert.dismiss(animated: true)
83 | }
84 | }
85 |
86 | func startLoading() {
87 | listView.isHidden = true
88 | }
89 |
90 | func finishLoading() {
91 | listView.isHidden = false
92 | }
93 |
94 | func setPeople(people: [People]) {
95 | adapter.list = people
96 | listView.isHidden = false
97 | listView.reloadData()
98 | }
99 |
100 | func setEmptyPeople() {
101 | listView.isHidden = true
102 | }
103 | }
104 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwiftTests/Pods-MVPSwiftTests-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 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then
14 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")"
15 | elif [ -r "$1" ]; then
16 | local source="$1"
17 | fi
18 |
19 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
20 |
21 | if [ -L "${source}" ]; then
22 | echo "Symlinked..."
23 | source="$(readlink "${source}")"
24 | fi
25 |
26 | # use filter instead of exclude so missing patterns dont' throw errors
27 | echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\""
28 | rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}"
29 |
30 | local basename
31 | basename="$(basename -s .framework "$1")"
32 | binary="${destination}/${basename}.framework/${basename}"
33 | if ! [ -r "$binary" ]; then
34 | binary="${destination}/${basename}"
35 | fi
36 |
37 | # Strip invalid architectures so "fat" simulator / device frameworks work on device
38 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then
39 | strip_invalid_archs "$binary"
40 | fi
41 |
42 | # Resign the code if required by the build settings to avoid unstable apps
43 | code_sign_if_enabled "${destination}/$(basename "$1")"
44 |
45 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.
46 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then
47 | local swift_runtime_libs
48 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]})
49 | for lib in $swift_runtime_libs; do
50 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\""
51 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}"
52 | code_sign_if_enabled "${destination}/${lib}"
53 | done
54 | fi
55 | }
56 |
57 | # Signs a framework with the provided identity
58 | code_sign_if_enabled() {
59 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then
60 | # Use the current code_sign_identitiy
61 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}"
62 | echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements \"$1\""
63 | /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements "$1"
64 | fi
65 | }
66 |
67 | # Strip invalid architectures
68 | strip_invalid_archs() {
69 | binary="$1"
70 | # Get architectures for current file
71 | archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)"
72 | stripped=""
73 | for arch in $archs; do
74 | if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then
75 | # Strip non-valid architectures in-place
76 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1
77 | stripped="$stripped $arch"
78 | fi
79 | done
80 | if [[ "$stripped" ]]; then
81 | echo "Stripped $binary of architectures:$stripped"
82 | fi
83 | }
84 |
85 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwiftUITests/Pods-MVPSwiftUITests-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 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then
14 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")"
15 | elif [ -r "$1" ]; then
16 | local source="$1"
17 | fi
18 |
19 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
20 |
21 | if [ -L "${source}" ]; then
22 | echo "Symlinked..."
23 | source="$(readlink "${source}")"
24 | fi
25 |
26 | # use filter instead of exclude so missing patterns dont' throw errors
27 | echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\""
28 | rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}"
29 |
30 | local basename
31 | basename="$(basename -s .framework "$1")"
32 | binary="${destination}/${basename}.framework/${basename}"
33 | if ! [ -r "$binary" ]; then
34 | binary="${destination}/${basename}"
35 | fi
36 |
37 | # Strip invalid architectures so "fat" simulator / device frameworks work on device
38 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then
39 | strip_invalid_archs "$binary"
40 | fi
41 |
42 | # Resign the code if required by the build settings to avoid unstable apps
43 | code_sign_if_enabled "${destination}/$(basename "$1")"
44 |
45 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.
46 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then
47 | local swift_runtime_libs
48 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]})
49 | for lib in $swift_runtime_libs; do
50 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\""
51 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}"
52 | code_sign_if_enabled "${destination}/${lib}"
53 | done
54 | fi
55 | }
56 |
57 | # Signs a framework with the provided identity
58 | code_sign_if_enabled() {
59 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then
60 | # Use the current code_sign_identitiy
61 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}"
62 | echo "/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements \"$1\""
63 | /usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements "$1"
64 | fi
65 | }
66 |
67 | # Strip invalid architectures
68 | strip_invalid_archs() {
69 | binary="$1"
70 | # Get architectures for current file
71 | archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)"
72 | stripped=""
73 | for arch in $archs; do
74 | if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then
75 | # Strip non-valid architectures in-place
76 | lipo -remove "$arch" -output "$binary" "$binary" || exit 1
77 | stripped="$stripped $arch"
78 | fi
79 | done
80 | if [[ "$stripped" ]]; then
81 | echo "Stripped $binary of architectures:$stripped"
82 | fi
83 | }
84 |
85 |
--------------------------------------------------------------------------------
/Pods/Alamofire/Source/MultipartUpload.swift:
--------------------------------------------------------------------------------
1 | //
2 | // MultipartUpload.swift
3 | //
4 | // Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 | //
6 | // Permission is hereby granted, free of charge, to any person obtaining a copy
7 | // of this software and associated documentation files (the "Software"), to deal
8 | // in the Software without restriction, including without limitation the rights
9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | // copies of the Software, and to permit persons to whom the Software is
11 | // furnished to do so, subject to the following conditions:
12 | //
13 | // The above copyright notice and this permission notice shall be included in
14 | // all copies or substantial portions of the Software.
15 | //
16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | // THE SOFTWARE.
23 | //
24 |
25 | import Foundation
26 |
27 | /// Internal type which encapsulates a `MultipartFormData` upload.
28 | final class MultipartUpload {
29 | lazy var result = Result { try build() }
30 |
31 | @Protected
32 | private(set) var multipartFormData: MultipartFormData
33 | let encodingMemoryThreshold: UInt64
34 | let request: URLRequestConvertible
35 | let fileManager: FileManager
36 |
37 | init(encodingMemoryThreshold: UInt64,
38 | request: URLRequestConvertible,
39 | multipartFormData: MultipartFormData) {
40 | self.encodingMemoryThreshold = encodingMemoryThreshold
41 | self.request = request
42 | fileManager = multipartFormData.fileManager
43 | self.multipartFormData = multipartFormData
44 | }
45 |
46 | func build() throws -> UploadRequest.Uploadable {
47 | let uploadable: UploadRequest.Uploadable
48 | if $multipartFormData.contentLength < encodingMemoryThreshold {
49 | let data = try $multipartFormData.read { try $0.encode() }
50 |
51 | uploadable = .data(data)
52 | } else {
53 | let tempDirectoryURL = fileManager.temporaryDirectory
54 | let directoryURL = tempDirectoryURL.appendingPathComponent("org.alamofire.manager/multipart.form.data")
55 | let fileName = UUID().uuidString
56 | let fileURL = directoryURL.appendingPathComponent(fileName)
57 |
58 | try fileManager.createDirectory(at: directoryURL, withIntermediateDirectories: true, attributes: nil)
59 |
60 | do {
61 | try $multipartFormData.read { try $0.writeEncodedData(to: fileURL) }
62 | } catch {
63 | // Cleanup after attempted write if it fails.
64 | try? fileManager.removeItem(at: fileURL)
65 | throw error
66 | }
67 |
68 | uploadable = .file(fileURL, shouldRemove: true)
69 | }
70 |
71 | return uploadable
72 | }
73 | }
74 |
75 | extension MultipartUpload: UploadConvertible {
76 | func asURLRequest() throws -> URLRequest {
77 | var urlRequest = try request.asURLRequest()
78 |
79 | $multipartFormData.read { multipartFormData in
80 | urlRequest.headers.add(.contentType(multipartFormData.contentType))
81 | }
82 |
83 | return urlRequest
84 | }
85 |
86 | func createUploadable() throws -> UploadRequest.Uploadable {
87 | try result.get()
88 | }
89 | }
90 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwift/Pods-MVPSwift-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) 2014-2022 Alamofire Software Foundation (http://alamofire.org/)
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 | License
38 | MIT
39 | Title
40 | Alamofire
41 | Type
42 | PSGroupSpecifier
43 |
44 |
45 | FooterText
46 | The MIT License (MIT)
47 |
48 | Copyright (c) 2017 Ruoyu Fu
49 |
50 | Permission is hereby granted, free of charge, to any person obtaining a copy
51 | of this software and associated documentation files (the "Software"), to deal
52 | in the Software without restriction, including without limitation the rights
53 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
54 | copies of the Software, and to permit persons to whom the Software is
55 | furnished to do so, subject to the following conditions:
56 |
57 | The above copyright notice and this permission notice shall be included in
58 | all copies or substantial portions of the Software.
59 |
60 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
61 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
62 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
63 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
64 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
65 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
66 | THE SOFTWARE.
67 |
68 | License
69 | MIT
70 | Title
71 | SwiftyJSON
72 | Type
73 | PSGroupSpecifier
74 |
75 |
76 | FooterText
77 | Generated by CocoaPods - https://cocoapods.org
78 | Title
79 |
80 | Type
81 | PSGroupSpecifier
82 |
83 |
84 | StringsTable
85 | Acknowledgements
86 | Title
87 | Acknowledgements
88 |
89 |
90 |
--------------------------------------------------------------------------------
/MVPSwift/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // MVPSwift
4 | //
5 | // Created by Nanda w Perdana on 1/16/17.
6 | // Copyright © 2017 Nanda w Perdana. All rights reserved.
7 | //
8 |
9 | import UIKit
10 |
11 | @UIApplicationMain
12 | class AppDelegate: UIResponder, UIApplicationDelegate, UITabBarControllerDelegate {
13 |
14 | var window: UIWindow?
15 | var tabBarController: UITabBarController?
16 |
17 | var viewController: UIViewController? {
18 | let navController = tabBarController?.selectedViewController as? UINavigationController
19 | return navController?.visibleViewController
20 | }
21 |
22 | enum TabIndex: Int {
23 | case people
24 | case more
25 | }
26 |
27 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
28 | // Override point for customization after application launch.
29 | tabBarController = UITabBarController()
30 | tabBarController?.delegate = self
31 |
32 | let peopleVC = PeopleViewController()
33 | let moreVC = UIViewController()
34 |
35 | let tabViews = [
36 | peopleVC,
37 | moreVC
38 | ]
39 |
40 | peopleVC.title = "People"
41 | moreVC.title = "More"
42 |
43 | if #available(iOS 13.0, *) {
44 | peopleVC.tabBarItem = UITabBarItem(title: "People", image: UIImage(systemName: "house"), selectedImage: nil)
45 | moreVC.tabBarItem = UITabBarItem(title: "More", image: UIImage(systemName: "bell"), selectedImage: nil)
46 | } else {
47 | peopleVC.tabBarItem = UITabBarItem(title: "People", image: nil, selectedImage: nil)
48 | moreVC.tabBarItem = UITabBarItem(title: "More", image: nil, selectedImage: nil)
49 | }
50 |
51 | tabBarController?.viewControllers = tabViews.compactMap { UINavigationController(rootViewController: $0) }
52 | tabBarController?.tabBar.barTintColor = .lightGray
53 | tabBarController?.tabBar.unselectedItemTintColor = .darkGray
54 | tabBarController?.tabBar.tintColor = .black
55 |
56 | UINavigationBar.appearance().tintColor = .white
57 |
58 | window = UIWindow(frame: UIScreen.main.bounds)
59 | window?.backgroundColor = .clear
60 | window?.rootViewController = tabBarController
61 | window?.makeKeyAndVisible()
62 |
63 | return true
64 | }
65 |
66 | func applicationWillResignActive(_ application: UIApplication) {
67 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
68 | // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
69 | }
70 |
71 | func applicationDidEnterBackground(_ application: UIApplication) {
72 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
73 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
74 | }
75 |
76 | func applicationWillEnterForeground(_ application: UIApplication) {
77 | // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
78 | }
79 |
80 | func applicationDidBecomeActive(_ application: UIApplication) {
81 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
82 | }
83 |
84 | func applicationWillTerminate(_ application: UIApplication) {
85 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
86 | }
87 |
88 |
89 | }
90 |
--------------------------------------------------------------------------------
/Pods/Alamofire/Source/URLConvertible+URLRequestConvertible.swift:
--------------------------------------------------------------------------------
1 | //
2 | // URLConvertible+URLRequestConvertible.swift
3 | //
4 | // Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 | //
6 | // Permission is hereby granted, free of charge, to any person obtaining a copy
7 | // of this software and associated documentation files (the "Software"), to deal
8 | // in the Software without restriction, including without limitation the rights
9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | // copies of the Software, and to permit persons to whom the Software is
11 | // furnished to do so, subject to the following conditions:
12 | //
13 | // The above copyright notice and this permission notice shall be included in
14 | // all copies or substantial portions of the Software.
15 | //
16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | // THE SOFTWARE.
23 | //
24 |
25 | import Foundation
26 |
27 | /// Types adopting the `URLConvertible` protocol can be used to construct `URL`s, which can then be used to construct
28 | /// `URLRequests`.
29 | public protocol URLConvertible {
30 | /// Returns a `URL` from the conforming instance or throws.
31 | ///
32 | /// - Returns: The `URL` created from the instance.
33 | /// - Throws: Any error thrown while creating the `URL`.
34 | func asURL() throws -> URL
35 | }
36 |
37 | extension String: URLConvertible {
38 | /// Returns a `URL` if `self` can be used to initialize a `URL` instance, otherwise throws.
39 | ///
40 | /// - Returns: The `URL` initialized with `self`.
41 | /// - Throws: An `AFError.invalidURL` instance.
42 | public func asURL() throws -> URL {
43 | guard let url = URL(string: self) else { throw AFError.invalidURL(url: self) }
44 |
45 | return url
46 | }
47 | }
48 |
49 | extension URL: URLConvertible {
50 | /// Returns `self`.
51 | public func asURL() throws -> URL { self }
52 | }
53 |
54 | extension URLComponents: URLConvertible {
55 | /// Returns a `URL` if the `self`'s `url` is not nil, otherwise throws.
56 | ///
57 | /// - Returns: The `URL` from the `url` property.
58 | /// - Throws: An `AFError.invalidURL` instance.
59 | public func asURL() throws -> URL {
60 | guard let url = url else { throw AFError.invalidURL(url: self) }
61 |
62 | return url
63 | }
64 | }
65 |
66 | // MARK: -
67 |
68 | /// Types adopting the `URLRequestConvertible` protocol can be used to safely construct `URLRequest`s.
69 | public protocol URLRequestConvertible {
70 | /// Returns a `URLRequest` or throws if an `Error` was encountered.
71 | ///
72 | /// - Returns: A `URLRequest`.
73 | /// - Throws: Any error thrown while constructing the `URLRequest`.
74 | func asURLRequest() throws -> URLRequest
75 | }
76 |
77 | extension URLRequestConvertible {
78 | /// The `URLRequest` returned by discarding any `Error` encountered.
79 | public var urlRequest: URLRequest? { try? asURLRequest() }
80 | }
81 |
82 | extension URLRequest: URLRequestConvertible {
83 | /// Returns `self`.
84 | public func asURLRequest() throws -> URLRequest { self }
85 | }
86 |
87 | // MARK: -
88 |
89 | extension URLRequest {
90 | /// Creates an instance with the specified `url`, `method`, and `headers`.
91 | ///
92 | /// - Parameters:
93 | /// - url: The `URLConvertible` value.
94 | /// - method: The `HTTPMethod`.
95 | /// - headers: The `HTTPHeaders`, `nil` by default.
96 | /// - Throws: Any error thrown while converting the `URLConvertible` to a `URL`.
97 | public init(url: URLConvertible, method: HTTPMethod, headers: HTTPHeaders? = nil) throws {
98 | let url = try url.asURL()
99 |
100 | self.init(url: url)
101 |
102 | httpMethod = method.rawValue
103 | allHTTPHeaderFields = headers?.dictionary
104 | }
105 | }
106 |
--------------------------------------------------------------------------------
/MVPSwift.xcodeproj/xcuserdata/NwP.xcuserdatad/xcschemes/MVPSwift.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
33 |
39 |
40 |
41 |
43 |
49 |
50 |
51 |
52 |
53 |
59 |
60 |
61 |
62 |
63 |
64 |
74 |
76 |
82 |
83 |
84 |
85 |
86 |
87 |
93 |
95 |
101 |
102 |
103 |
104 |
106 |
107 |
110 |
111 |
112 |
--------------------------------------------------------------------------------
/Pods/Alamofire/Source/Result+Alamofire.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Result+Alamofire.swift
3 | //
4 | // Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.org/)
5 | //
6 | // Permission is hereby granted, free of charge, to any person obtaining a copy
7 | // of this software and associated documentation files (the "Software"), to deal
8 | // in the Software without restriction, including without limitation the rights
9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | // copies of the Software, and to permit persons to whom the Software is
11 | // furnished to do so, subject to the following conditions:
12 | //
13 | // The above copyright notice and this permission notice shall be included in
14 | // all copies or substantial portions of the Software.
15 | //
16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | // THE SOFTWARE.
23 | //
24 |
25 | import Foundation
26 |
27 | /// Default type of `Result` returned by Alamofire, with an `AFError` `Failure` type.
28 | public typealias AFResult = Result
29 |
30 | // MARK: - Internal APIs
31 |
32 | extension Result {
33 | /// Returns whether the instance is `.success`.
34 | var isSuccess: Bool {
35 | guard case .success = self else { return false }
36 | return true
37 | }
38 |
39 | /// Returns whether the instance is `.failure`.
40 | var isFailure: Bool {
41 | !isSuccess
42 | }
43 |
44 | /// Returns the associated value if the result is a success, `nil` otherwise.
45 | var success: Success? {
46 | guard case let .success(value) = self else { return nil }
47 | return value
48 | }
49 |
50 | /// Returns the associated error value if the result is a failure, `nil` otherwise.
51 | var failure: Failure? {
52 | guard case let .failure(error) = self else { return nil }
53 | return error
54 | }
55 |
56 | /// Initializes a `Result` from value or error. Returns `.failure` if the error is non-nil, `.success` otherwise.
57 | ///
58 | /// - Parameters:
59 | /// - value: A value.
60 | /// - error: An `Error`.
61 | init(value: Success, error: Failure?) {
62 | if let error = error {
63 | self = .failure(error)
64 | } else {
65 | self = .success(value)
66 | }
67 | }
68 |
69 | /// Evaluates the specified closure when the `Result` is a success, passing the unwrapped value as a parameter.
70 | ///
71 | /// Use the `tryMap` method with a closure that may throw an error. For example:
72 | ///
73 | /// let possibleData: Result = .success(Data(...))
74 | /// let possibleObject = possibleData.tryMap {
75 | /// try JSONSerialization.jsonObject(with: $0)
76 | /// }
77 | ///
78 | /// - parameter transform: A closure that takes the success value of the instance.
79 | ///
80 | /// - returns: A `Result` containing the result of the given closure. If this instance is a failure, returns the
81 | /// same failure.
82 | func tryMap(_ transform: (Success) throws -> NewSuccess) -> Result {
83 | switch self {
84 | case let .success(value):
85 | do {
86 | return try .success(transform(value))
87 | } catch {
88 | return .failure(error)
89 | }
90 | case let .failure(error):
91 | return .failure(error)
92 | }
93 | }
94 |
95 | /// Evaluates the specified closure when the `Result` is a failure, passing the unwrapped error as a parameter.
96 | ///
97 | /// Use the `tryMapError` function with a closure that may throw an error. For example:
98 | ///
99 | /// let possibleData: Result = .success(Data(...))
100 | /// let possibleObject = possibleData.tryMapError {
101 | /// try someFailableFunction(taking: $0)
102 | /// }
103 | ///
104 | /// - Parameter transform: A throwing closure that takes the error of the instance.
105 | ///
106 | /// - Returns: A `Result` instance containing the result of the transform. If this instance is a success, returns
107 | /// the same success.
108 | func tryMapError(_ transform: (Failure) throws -> NewFailure) -> Result {
109 | switch self {
110 | case let .failure(error):
111 | do {
112 | return try .failure(transform(error))
113 | } catch {
114 | return .failure(error)
115 | }
116 | case let .success(value):
117 | return .success(value)
118 | }
119 | }
120 | }
121 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwift/Pods-MVPSwift-resources.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | set -e
3 |
4 | mkdir -p "${TARGET_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 | case "${TARGETED_DEVICE_FAMILY}" in
12 | 1,2)
13 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone"
14 | ;;
15 | 1)
16 | TARGET_DEVICE_ARGS="--target-device iphone"
17 | ;;
18 | 2)
19 | TARGET_DEVICE_ARGS="--target-device ipad"
20 | ;;
21 | *)
22 | TARGET_DEVICE_ARGS="--target-device mac"
23 | ;;
24 | esac
25 |
26 | install_resource()
27 | {
28 | if [[ "$1" = /* ]] ; then
29 | RESOURCE_PATH="$1"
30 | else
31 | RESOURCE_PATH="${PODS_ROOT}/$1"
32 | fi
33 | if [[ ! -e "$RESOURCE_PATH" ]] ; then
34 | cat << EOM
35 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script.
36 | EOM
37 | exit 1
38 | fi
39 | case $RESOURCE_PATH in
40 | *.storyboard)
41 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}"
42 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS}
43 | ;;
44 | *.xib)
45 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}"
46 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS}
47 | ;;
48 | *.framework)
49 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
50 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
51 | echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
52 | rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
53 | ;;
54 | *.xcdatamodel)
55 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\""
56 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom"
57 | ;;
58 | *.xcdatamodeld)
59 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\""
60 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd"
61 | ;;
62 | *.xcmappingmodel)
63 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\""
64 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm"
65 | ;;
66 | *.xcassets)
67 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH"
68 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE")
69 | ;;
70 | *)
71 | echo "$RESOURCE_PATH"
72 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY"
73 | ;;
74 | esac
75 | }
76 |
77 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
78 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
79 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then
80 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
81 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
82 | fi
83 | rm -f "$RESOURCES_TO_COPY"
84 |
85 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ]
86 | then
87 | # Find all other xcassets (this unfortunately includes those of path pods and other targets).
88 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d)
89 | while read line; do
90 | if [[ $line != "${PODS_ROOT}*" ]]; then
91 | XCASSET_FILES+=("$line")
92 | fi
93 | done <<<"$OTHER_XCASSETS"
94 |
95 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
96 | fi
97 |
--------------------------------------------------------------------------------
/Pods/Alamofire/Source/CachedResponseHandler.swift:
--------------------------------------------------------------------------------
1 | //
2 | // CachedResponseHandler.swift
3 | //
4 | // Copyright (c) 2019 Alamofire Software Foundation (http://alamofire.org/)
5 | //
6 | // Permission is hereby granted, free of charge, to any person obtaining a copy
7 | // of this software and associated documentation files (the "Software"), to deal
8 | // in the Software without restriction, including without limitation the rights
9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | // copies of the Software, and to permit persons to whom the Software is
11 | // furnished to do so, subject to the following conditions:
12 | //
13 | // The above copyright notice and this permission notice shall be included in
14 | // all copies or substantial portions of the Software.
15 | //
16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | // THE SOFTWARE.
23 | //
24 |
25 | import Foundation
26 |
27 | /// A type that handles whether the data task should store the HTTP response in the cache.
28 | public protocol CachedResponseHandler {
29 | /// Determines whether the HTTP response should be stored in the cache.
30 | ///
31 | /// The `completion` closure should be passed one of three possible options:
32 | ///
33 | /// 1. The cached response provided by the server (this is the most common use case).
34 | /// 2. A modified version of the cached response (you may want to modify it in some way before caching).
35 | /// 3. A `nil` value to prevent the cached response from being stored in the cache.
36 | ///
37 | /// - Parameters:
38 | /// - task: The data task whose request resulted in the cached response.
39 | /// - response: The cached response to potentially store in the cache.
40 | /// - completion: The closure to execute containing cached response, a modified response, or `nil`.
41 | func dataTask(_ task: URLSessionDataTask,
42 | willCacheResponse response: CachedURLResponse,
43 | completion: @escaping (CachedURLResponse?) -> Void)
44 | }
45 |
46 | // MARK: -
47 |
48 | /// `ResponseCacher` is a convenience `CachedResponseHandler` making it easy to cache, not cache, or modify a cached
49 | /// response.
50 | public struct ResponseCacher {
51 | /// Defines the behavior of the `ResponseCacher` type.
52 | public enum Behavior {
53 | /// Stores the cached response in the cache.
54 | case cache
55 | /// Prevents the cached response from being stored in the cache.
56 | case doNotCache
57 | /// Modifies the cached response before storing it in the cache.
58 | case modify((URLSessionDataTask, CachedURLResponse) -> CachedURLResponse?)
59 | }
60 |
61 | /// Returns a `ResponseCacher` with a `.cache` `Behavior`.
62 | public static let cache = ResponseCacher(behavior: .cache)
63 | /// Returns a `ResponseCacher` with a `.doNotCache` `Behavior`.
64 | public static let doNotCache = ResponseCacher(behavior: .doNotCache)
65 |
66 | /// The `Behavior` of the `ResponseCacher`.
67 | public let behavior: Behavior
68 |
69 | /// Creates a `ResponseCacher` instance from the `Behavior`.
70 | ///
71 | /// - Parameter behavior: The `Behavior`.
72 | public init(behavior: Behavior) {
73 | self.behavior = behavior
74 | }
75 | }
76 |
77 | extension ResponseCacher: CachedResponseHandler {
78 | public func dataTask(_ task: URLSessionDataTask,
79 | willCacheResponse response: CachedURLResponse,
80 | completion: @escaping (CachedURLResponse?) -> Void) {
81 | switch behavior {
82 | case .cache:
83 | completion(response)
84 | case .doNotCache:
85 | completion(nil)
86 | case let .modify(closure):
87 | let response = closure(task, response)
88 | completion(response)
89 | }
90 | }
91 | }
92 |
93 | #if swift(>=5.5)
94 | extension CachedResponseHandler where Self == ResponseCacher {
95 | /// Provides a `ResponseCacher` which caches the response, if allowed. Equivalent to `ResponseCacher.cache`.
96 | public static var cache: ResponseCacher { .cache }
97 |
98 | /// Provides a `ResponseCacher` which does not cache the response. Equivalent to `ResponseCacher.doNotCache`.
99 | public static var doNotCache: ResponseCacher { .doNotCache }
100 |
101 | /// Creates a `ResponseCacher` which modifies the proposed `CachedURLResponse` using the provided closure.
102 | ///
103 | /// - Parameter closure: Closure used to modify the `CachedURLResponse`.
104 | /// - Returns: The `ResponseCacher`.
105 | public static func modify(using closure: @escaping ((URLSessionDataTask, CachedURLResponse) -> CachedURLResponse?)) -> ResponseCacher {
106 | ResponseCacher(behavior: .modify(closure))
107 | }
108 | }
109 | #endif
110 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwiftTests/Pods-MVPSwiftTests-resources.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | set -e
3 |
4 | mkdir -p "${TARGET_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 | case "${TARGETED_DEVICE_FAMILY}" in
12 | 1,2)
13 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone"
14 | ;;
15 | 1)
16 | TARGET_DEVICE_ARGS="--target-device iphone"
17 | ;;
18 | 2)
19 | TARGET_DEVICE_ARGS="--target-device ipad"
20 | ;;
21 | *)
22 | TARGET_DEVICE_ARGS="--target-device mac"
23 | ;;
24 | esac
25 |
26 | install_resource()
27 | {
28 | if [[ "$1" = /* ]] ; then
29 | RESOURCE_PATH="$1"
30 | else
31 | RESOURCE_PATH="${PODS_ROOT}/$1"
32 | fi
33 | if [[ ! -e "$RESOURCE_PATH" ]] ; then
34 | cat << EOM
35 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script.
36 | EOM
37 | exit 1
38 | fi
39 | case $RESOURCE_PATH in
40 | *.storyboard)
41 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}"
42 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS}
43 | ;;
44 | *.xib)
45 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}"
46 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS}
47 | ;;
48 | *.framework)
49 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
50 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
51 | echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
52 | rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
53 | ;;
54 | *.xcdatamodel)
55 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\""
56 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom"
57 | ;;
58 | *.xcdatamodeld)
59 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\""
60 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd"
61 | ;;
62 | *.xcmappingmodel)
63 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\""
64 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm"
65 | ;;
66 | *.xcassets)
67 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH"
68 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE")
69 | ;;
70 | *)
71 | echo "$RESOURCE_PATH"
72 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY"
73 | ;;
74 | esac
75 | }
76 |
77 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
78 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
79 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then
80 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
81 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
82 | fi
83 | rm -f "$RESOURCES_TO_COPY"
84 |
85 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ]
86 | then
87 | # Find all other xcassets (this unfortunately includes those of path pods and other targets).
88 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d)
89 | while read line; do
90 | if [[ $line != "${PODS_ROOT}*" ]]; then
91 | XCASSET_FILES+=("$line")
92 | fi
93 | done <<<"$OTHER_XCASSETS"
94 |
95 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
96 | fi
97 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwiftUITests/Pods-MVPSwiftUITests-resources.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | set -e
3 |
4 | mkdir -p "${TARGET_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 | case "${TARGETED_DEVICE_FAMILY}" in
12 | 1,2)
13 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone"
14 | ;;
15 | 1)
16 | TARGET_DEVICE_ARGS="--target-device iphone"
17 | ;;
18 | 2)
19 | TARGET_DEVICE_ARGS="--target-device ipad"
20 | ;;
21 | *)
22 | TARGET_DEVICE_ARGS="--target-device mac"
23 | ;;
24 | esac
25 |
26 | install_resource()
27 | {
28 | if [[ "$1" = /* ]] ; then
29 | RESOURCE_PATH="$1"
30 | else
31 | RESOURCE_PATH="${PODS_ROOT}/$1"
32 | fi
33 | if [[ ! -e "$RESOURCE_PATH" ]] ; then
34 | cat << EOM
35 | error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script.
36 | EOM
37 | exit 1
38 | fi
39 | case $RESOURCE_PATH in
40 | *.storyboard)
41 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}"
42 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS}
43 | ;;
44 | *.xib)
45 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}"
46 | ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS}
47 | ;;
48 | *.framework)
49 | echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
50 | mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
51 | echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
52 | rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
53 | ;;
54 | *.xcdatamodel)
55 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\""
56 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom"
57 | ;;
58 | *.xcdatamodeld)
59 | echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\""
60 | xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd"
61 | ;;
62 | *.xcmappingmodel)
63 | echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\""
64 | xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm"
65 | ;;
66 | *.xcassets)
67 | ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH"
68 | XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE")
69 | ;;
70 | *)
71 | echo "$RESOURCE_PATH"
72 | echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY"
73 | ;;
74 | esac
75 | }
76 |
77 | mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
78 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
79 | if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then
80 | mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
81 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
82 | fi
83 | rm -f "$RESOURCES_TO_COPY"
84 |
85 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ]
86 | then
87 | # Find all other xcassets (this unfortunately includes those of path pods and other targets).
88 | OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d)
89 | while read line; do
90 | if [[ $line != "${PODS_ROOT}*" ]]; then
91 | XCASSET_FILES+=("$line")
92 | fi
93 | done <<<"$OTHER_XCASSETS"
94 |
95 | printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
96 | fi
97 |
--------------------------------------------------------------------------------
/Pods/Alamofire/Source/RedirectHandler.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RedirectHandler.swift
3 | //
4 | // Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 | //
6 | // Permission is hereby granted, free of charge, to any person obtaining a copy
7 | // of this software and associated documentation files (the "Software"), to deal
8 | // in the Software without restriction, including without limitation the rights
9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | // copies of the Software, and to permit persons to whom the Software is
11 | // furnished to do so, subject to the following conditions:
12 | //
13 | // The above copyright notice and this permission notice shall be included in
14 | // all copies or substantial portions of the Software.
15 | //
16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | // THE SOFTWARE.
23 | //
24 |
25 | import Foundation
26 |
27 | /// A type that handles how an HTTP redirect response from a remote server should be redirected to the new request.
28 | public protocol RedirectHandler {
29 | /// Determines how the HTTP redirect response should be redirected to the new request.
30 | ///
31 | /// The `completion` closure should be passed one of three possible options:
32 | ///
33 | /// 1. The new request specified by the redirect (this is the most common use case).
34 | /// 2. A modified version of the new request (you may want to route it somewhere else).
35 | /// 3. A `nil` value to deny the redirect request and return the body of the redirect response.
36 | ///
37 | /// - Parameters:
38 | /// - task: The `URLSessionTask` whose request resulted in a redirect.
39 | /// - request: The `URLRequest` to the new location specified by the redirect response.
40 | /// - response: The `HTTPURLResponse` containing the server's response to the original request.
41 | /// - completion: The closure to execute containing the new `URLRequest`, a modified `URLRequest`, or `nil`.
42 | func task(_ task: URLSessionTask,
43 | willBeRedirectedTo request: URLRequest,
44 | for response: HTTPURLResponse,
45 | completion: @escaping (URLRequest?) -> Void)
46 | }
47 |
48 | // MARK: -
49 |
50 | /// `Redirector` is a convenience `RedirectHandler` making it easy to follow, not follow, or modify a redirect.
51 | public struct Redirector {
52 | /// Defines the behavior of the `Redirector` type.
53 | public enum Behavior {
54 | /// Follow the redirect as defined in the response.
55 | case follow
56 | /// Do not follow the redirect defined in the response.
57 | case doNotFollow
58 | /// Modify the redirect request defined in the response.
59 | case modify((URLSessionTask, URLRequest, HTTPURLResponse) -> URLRequest?)
60 | }
61 |
62 | /// Returns a `Redirector` with a `.follow` `Behavior`.
63 | public static let follow = Redirector(behavior: .follow)
64 | /// Returns a `Redirector` with a `.doNotFollow` `Behavior`.
65 | public static let doNotFollow = Redirector(behavior: .doNotFollow)
66 |
67 | /// The `Behavior` of the `Redirector`.
68 | public let behavior: Behavior
69 |
70 | /// Creates a `Redirector` instance from the `Behavior`.
71 | ///
72 | /// - Parameter behavior: The `Behavior`.
73 | public init(behavior: Behavior) {
74 | self.behavior = behavior
75 | }
76 | }
77 |
78 | // MARK: -
79 |
80 | extension Redirector: RedirectHandler {
81 | public func task(_ task: URLSessionTask,
82 | willBeRedirectedTo request: URLRequest,
83 | for response: HTTPURLResponse,
84 | completion: @escaping (URLRequest?) -> Void) {
85 | switch behavior {
86 | case .follow:
87 | completion(request)
88 | case .doNotFollow:
89 | completion(nil)
90 | case let .modify(closure):
91 | let request = closure(task, request, response)
92 | completion(request)
93 | }
94 | }
95 | }
96 |
97 | #if swift(>=5.5)
98 | extension RedirectHandler where Self == Redirector {
99 | /// Provides a `Redirector` which follows redirects. Equivalent to `Redirector.follow`.
100 | public static var follow: Redirector { .follow }
101 |
102 | /// Provides a `Redirector` which does not follow redirects. Equivalent to `Redirector.doNotFollow`.
103 | public static var doNotFollow: Redirector { .doNotFollow }
104 |
105 | /// Creates a `Redirector` which modifies the redirected `URLRequest` using the provided closure.
106 | ///
107 | /// - Parameter closure: Closure used to modify the redirect.
108 | /// - Returns: The `Redirector`.
109 | public static func modify(using closure: @escaping (URLSessionTask, URLRequest, HTTPURLResponse) -> URLRequest?) -> Redirector {
110 | Redirector(behavior: .modify(closure))
111 | }
112 | }
113 | #endif
114 |
--------------------------------------------------------------------------------
/Pods/Alamofire/Source/Protected.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Protected.swift
3 | //
4 | // Copyright (c) 2014-2020 Alamofire Software Foundation (http://alamofire.org/)
5 | //
6 | // Permission is hereby granted, free of charge, to any person obtaining a copy
7 | // of this software and associated documentation files (the "Software"), to deal
8 | // in the Software without restriction, including without limitation the rights
9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | // copies of the Software, and to permit persons to whom the Software is
11 | // furnished to do so, subject to the following conditions:
12 | //
13 | // The above copyright notice and this permission notice shall be included in
14 | // all copies or substantial portions of the Software.
15 | //
16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | // THE SOFTWARE.
23 | //
24 |
25 | import Foundation
26 |
27 | private protocol Lock {
28 | func lock()
29 | func unlock()
30 | }
31 |
32 | extension Lock {
33 | /// Executes a closure returning a value while acquiring the lock.
34 | ///
35 | /// - Parameter closure: The closure to run.
36 | ///
37 | /// - Returns: The value the closure generated.
38 | func around(_ closure: () throws -> T) rethrows -> T {
39 | lock(); defer { unlock() }
40 | return try closure()
41 | }
42 |
43 | /// Execute a closure while acquiring the lock.
44 | ///
45 | /// - Parameter closure: The closure to run.
46 | func around(_ closure: () throws -> Void) rethrows {
47 | lock(); defer { unlock() }
48 | try closure()
49 | }
50 | }
51 |
52 | #if os(Linux) || os(Windows)
53 |
54 | extension NSLock: Lock {}
55 |
56 | #endif
57 |
58 | #if os(macOS) || os(iOS) || os(watchOS) || os(tvOS)
59 | /// An `os_unfair_lock` wrapper.
60 | final class UnfairLock: Lock {
61 | private let unfairLock: os_unfair_lock_t
62 |
63 | init() {
64 | unfairLock = .allocate(capacity: 1)
65 | unfairLock.initialize(to: os_unfair_lock())
66 | }
67 |
68 | deinit {
69 | unfairLock.deinitialize(count: 1)
70 | unfairLock.deallocate()
71 | }
72 |
73 | fileprivate func lock() {
74 | os_unfair_lock_lock(unfairLock)
75 | }
76 |
77 | fileprivate func unlock() {
78 | os_unfair_lock_unlock(unfairLock)
79 | }
80 | }
81 | #endif
82 |
83 | /// A thread-safe wrapper around a value.
84 | @propertyWrapper
85 | @dynamicMemberLookup
86 | final class Protected {
87 | #if os(macOS) || os(iOS) || os(watchOS) || os(tvOS)
88 | private let lock = UnfairLock()
89 | #elseif os(Linux) || os(Windows)
90 | private let lock = NSLock()
91 | #endif
92 | private var value: T
93 |
94 | init(_ value: T) {
95 | self.value = value
96 | }
97 |
98 | /// The contained value. Unsafe for anything more than direct read or write.
99 | var wrappedValue: T {
100 | get { lock.around { value } }
101 | set { lock.around { value = newValue } }
102 | }
103 |
104 | var projectedValue: Protected { self }
105 |
106 | init(wrappedValue: T) {
107 | value = wrappedValue
108 | }
109 |
110 | /// Synchronously read or transform the contained value.
111 | ///
112 | /// - Parameter closure: The closure to execute.
113 | ///
114 | /// - Returns: The return value of the closure passed.
115 | func read(_ closure: (T) throws -> U) rethrows -> U {
116 | try lock.around { try closure(self.value) }
117 | }
118 |
119 | /// Synchronously modify the protected value.
120 | ///
121 | /// - Parameter closure: The closure to execute.
122 | ///
123 | /// - Returns: The modified value.
124 | @discardableResult
125 | func write(_ closure: (inout T) throws -> U) rethrows -> U {
126 | try lock.around { try closure(&self.value) }
127 | }
128 |
129 | subscript(dynamicMember keyPath: WritableKeyPath) -> Property {
130 | get { lock.around { value[keyPath: keyPath] } }
131 | set { lock.around { value[keyPath: keyPath] = newValue } }
132 | }
133 |
134 | subscript(dynamicMember keyPath: KeyPath) -> Property {
135 | lock.around { value[keyPath: keyPath] }
136 | }
137 | }
138 |
139 | extension Protected where T == Request.MutableState {
140 | /// Attempts to transition to the passed `State`.
141 | ///
142 | /// - Parameter state: The `State` to attempt transition to.
143 | ///
144 | /// - Returns: Whether the transition occurred.
145 | func attemptToTransitionTo(_ state: Request.State) -> Bool {
146 | lock.around {
147 | guard value.state.canTransitionTo(state) else { return false }
148 |
149 | value.state = state
150 |
151 | return true
152 | }
153 | }
154 |
155 | /// Perform a closure while locked with the provided `Request.State`.
156 | ///
157 | /// - Parameter perform: The closure to perform while locked.
158 | func withState(perform: (Request.State) -> Void) {
159 | lock.around { perform(value.state) }
160 | }
161 | }
162 |
--------------------------------------------------------------------------------
/Pods/Alamofire/Source/Notifications.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Notifications.swift
3 | //
4 | // Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 | //
6 | // Permission is hereby granted, free of charge, to any person obtaining a copy
7 | // of this software and associated documentation files (the "Software"), to deal
8 | // in the Software without restriction, including without limitation the rights
9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | // copies of the Software, and to permit persons to whom the Software is
11 | // furnished to do so, subject to the following conditions:
12 | //
13 | // The above copyright notice and this permission notice shall be included in
14 | // all copies or substantial portions of the Software.
15 | //
16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | // THE SOFTWARE.
23 | //
24 |
25 | import Foundation
26 |
27 | extension Request {
28 | /// Posted when a `Request` is resumed. The `Notification` contains the resumed `Request`.
29 | public static let didResumeNotification = Notification.Name(rawValue: "org.alamofire.notification.name.request.didResume")
30 | /// Posted when a `Request` is suspended. The `Notification` contains the suspended `Request`.
31 | public static let didSuspendNotification = Notification.Name(rawValue: "org.alamofire.notification.name.request.didSuspend")
32 | /// Posted when a `Request` is cancelled. The `Notification` contains the cancelled `Request`.
33 | public static let didCancelNotification = Notification.Name(rawValue: "org.alamofire.notification.name.request.didCancel")
34 | /// Posted when a `Request` is finished. The `Notification` contains the completed `Request`.
35 | public static let didFinishNotification = Notification.Name(rawValue: "org.alamofire.notification.name.request.didFinish")
36 |
37 | /// Posted when a `URLSessionTask` is resumed. The `Notification` contains the `Request` associated with the `URLSessionTask`.
38 | public static let didResumeTaskNotification = Notification.Name(rawValue: "org.alamofire.notification.name.request.didResumeTask")
39 | /// Posted when a `URLSessionTask` is suspended. The `Notification` contains the `Request` associated with the `URLSessionTask`.
40 | public static let didSuspendTaskNotification = Notification.Name(rawValue: "org.alamofire.notification.name.request.didSuspendTask")
41 | /// Posted when a `URLSessionTask` is cancelled. The `Notification` contains the `Request` associated with the `URLSessionTask`.
42 | public static let didCancelTaskNotification = Notification.Name(rawValue: "org.alamofire.notification.name.request.didCancelTask")
43 | /// Posted when a `URLSessionTask` is completed. The `Notification` contains the `Request` associated with the `URLSessionTask`.
44 | public static let didCompleteTaskNotification = Notification.Name(rawValue: "org.alamofire.notification.name.request.didCompleteTask")
45 | }
46 |
47 | // MARK: -
48 |
49 | extension Notification {
50 | /// The `Request` contained by the instance's `userInfo`, `nil` otherwise.
51 | public var request: Request? {
52 | userInfo?[String.requestKey] as? Request
53 | }
54 |
55 | /// Convenience initializer for a `Notification` containing a `Request` payload.
56 | ///
57 | /// - Parameters:
58 | /// - name: The name of the notification.
59 | /// - request: The `Request` payload.
60 | init(name: Notification.Name, request: Request) {
61 | self.init(name: name, object: nil, userInfo: [String.requestKey: request])
62 | }
63 | }
64 |
65 | extension NotificationCenter {
66 | /// Convenience function for posting notifications with `Request` payloads.
67 | ///
68 | /// - Parameters:
69 | /// - name: The name of the notification.
70 | /// - request: The `Request` payload.
71 | func postNotification(named name: Notification.Name, with request: Request) {
72 | let notification = Notification(name: name, request: request)
73 | post(notification)
74 | }
75 | }
76 |
77 | extension String {
78 | /// User info dictionary key representing the `Request` associated with the notification.
79 | fileprivate static let requestKey = "org.alamofire.notification.key.request"
80 | }
81 |
82 | /// `EventMonitor` that provides Alamofire's notifications.
83 | public final class AlamofireNotifications: EventMonitor {
84 | public func requestDidResume(_ request: Request) {
85 | NotificationCenter.default.postNotification(named: Request.didResumeNotification, with: request)
86 | }
87 |
88 | public func requestDidSuspend(_ request: Request) {
89 | NotificationCenter.default.postNotification(named: Request.didSuspendNotification, with: request)
90 | }
91 |
92 | public func requestDidCancel(_ request: Request) {
93 | NotificationCenter.default.postNotification(named: Request.didCancelNotification, with: request)
94 | }
95 |
96 | public func requestDidFinish(_ request: Request) {
97 | NotificationCenter.default.postNotification(named: Request.didFinishNotification, with: request)
98 | }
99 |
100 | public func request(_ request: Request, didResumeTask task: URLSessionTask) {
101 | NotificationCenter.default.postNotification(named: Request.didResumeTaskNotification, with: request)
102 | }
103 |
104 | public func request(_ request: Request, didSuspendTask task: URLSessionTask) {
105 | NotificationCenter.default.postNotification(named: Request.didSuspendTaskNotification, with: request)
106 | }
107 |
108 | public func request(_ request: Request, didCancelTask task: URLSessionTask) {
109 | NotificationCenter.default.postNotification(named: Request.didCancelTaskNotification, with: request)
110 | }
111 |
112 | public func request(_ request: Request, didCompleteTask task: URLSessionTask, with error: AFError?) {
113 | NotificationCenter.default.postNotification(named: Request.didCompleteTaskNotification, with: request)
114 | }
115 | }
116 |
--------------------------------------------------------------------------------
/Pods/Alamofire/Source/RequestTaskMap.swift:
--------------------------------------------------------------------------------
1 | //
2 | // RequestTaskMap.swift
3 | //
4 | // Copyright (c) 2014-2018 Alamofire Software Foundation (http://alamofire.org/)
5 | //
6 | // Permission is hereby granted, free of charge, to any person obtaining a copy
7 | // of this software and associated documentation files (the "Software"), to deal
8 | // in the Software without restriction, including without limitation the rights
9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | // copies of the Software, and to permit persons to whom the Software is
11 | // furnished to do so, subject to the following conditions:
12 | //
13 | // The above copyright notice and this permission notice shall be included in
14 | // all copies or substantial portions of the Software.
15 | //
16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 | // THE SOFTWARE.
23 | //
24 |
25 | import Foundation
26 |
27 | /// A type that maintains a two way, one to one map of `URLSessionTask`s to `Request`s.
28 | struct RequestTaskMap {
29 | private typealias Events = (completed: Bool, metricsGathered: Bool)
30 |
31 | private var tasksToRequests: [URLSessionTask: Request]
32 | private var requestsToTasks: [Request: URLSessionTask]
33 | private var taskEvents: [URLSessionTask: Events]
34 |
35 | var requests: [Request] {
36 | Array(tasksToRequests.values)
37 | }
38 |
39 | init(tasksToRequests: [URLSessionTask: Request] = [:],
40 | requestsToTasks: [Request: URLSessionTask] = [:],
41 | taskEvents: [URLSessionTask: (completed: Bool, metricsGathered: Bool)] = [:]) {
42 | self.tasksToRequests = tasksToRequests
43 | self.requestsToTasks = requestsToTasks
44 | self.taskEvents = taskEvents
45 | }
46 |
47 | subscript(_ request: Request) -> URLSessionTask? {
48 | get { requestsToTasks[request] }
49 | set {
50 | guard let newValue = newValue else {
51 | guard let task = requestsToTasks[request] else {
52 | fatalError("RequestTaskMap consistency error: no task corresponding to request found.")
53 | }
54 |
55 | requestsToTasks.removeValue(forKey: request)
56 | tasksToRequests.removeValue(forKey: task)
57 | taskEvents.removeValue(forKey: task)
58 |
59 | return
60 | }
61 |
62 | requestsToTasks[request] = newValue
63 | tasksToRequests[newValue] = request
64 | taskEvents[newValue] = (completed: false, metricsGathered: false)
65 | }
66 | }
67 |
68 | subscript(_ task: URLSessionTask) -> Request? {
69 | get { tasksToRequests[task] }
70 | set {
71 | guard let newValue = newValue else {
72 | guard let request = tasksToRequests[task] else {
73 | fatalError("RequestTaskMap consistency error: no request corresponding to task found.")
74 | }
75 |
76 | tasksToRequests.removeValue(forKey: task)
77 | requestsToTasks.removeValue(forKey: request)
78 | taskEvents.removeValue(forKey: task)
79 |
80 | return
81 | }
82 |
83 | tasksToRequests[task] = newValue
84 | requestsToTasks[newValue] = task
85 | taskEvents[task] = (completed: false, metricsGathered: false)
86 | }
87 | }
88 |
89 | var count: Int {
90 | precondition(tasksToRequests.count == requestsToTasks.count,
91 | "RequestTaskMap.count invalid, requests.count: \(tasksToRequests.count) != tasks.count: \(requestsToTasks.count)")
92 |
93 | return tasksToRequests.count
94 | }
95 |
96 | var eventCount: Int {
97 | precondition(taskEvents.count == count, "RequestTaskMap.eventCount invalid, count: \(count) != taskEvents.count: \(taskEvents.count)")
98 |
99 | return taskEvents.count
100 | }
101 |
102 | var isEmpty: Bool {
103 | precondition(tasksToRequests.isEmpty == requestsToTasks.isEmpty,
104 | "RequestTaskMap.isEmpty invalid, requests.isEmpty: \(tasksToRequests.isEmpty) != tasks.isEmpty: \(requestsToTasks.isEmpty)")
105 |
106 | return tasksToRequests.isEmpty
107 | }
108 |
109 | var isEventsEmpty: Bool {
110 | precondition(taskEvents.isEmpty == isEmpty, "RequestTaskMap.isEventsEmpty invalid, isEmpty: \(isEmpty) != taskEvents.isEmpty: \(taskEvents.isEmpty)")
111 |
112 | return taskEvents.isEmpty
113 | }
114 |
115 | mutating func disassociateIfNecessaryAfterGatheringMetricsForTask(_ task: URLSessionTask) -> Bool {
116 | guard let events = taskEvents[task] else {
117 | fatalError("RequestTaskMap consistency error: no events corresponding to task found.")
118 | }
119 |
120 | switch (events.completed, events.metricsGathered) {
121 | case (_, true): fatalError("RequestTaskMap consistency error: duplicate metricsGatheredForTask call.")
122 | case (false, false): taskEvents[task] = (completed: false, metricsGathered: true); return false
123 | case (true, false): self[task] = nil; return true
124 | }
125 | }
126 |
127 | mutating func disassociateIfNecessaryAfterCompletingTask(_ task: URLSessionTask) -> Bool {
128 | guard let events = taskEvents[task] else {
129 | fatalError("RequestTaskMap consistency error: no events corresponding to task found.")
130 | }
131 |
132 | switch (events.completed, events.metricsGathered) {
133 | case (true, _): fatalError("RequestTaskMap consistency error: duplicate completionReceivedForTask call.")
134 | #if os(Linux) // Linux doesn't gather metrics, so unconditionally remove the reference and return true.
135 | default: self[task] = nil; return true
136 | #else
137 | case (false, false):
138 | if #available(macOS 10.12, iOS 10, watchOS 7, tvOS 10, *) {
139 | taskEvents[task] = (completed: true, metricsGathered: false); return false
140 | } else {
141 | // watchOS < 7 doesn't gather metrics, so unconditionally remove the reference and return true.
142 | self[task] = nil; return true
143 | }
144 | case (false, true):
145 | self[task] = nil; return true
146 | #endif
147 | }
148 | }
149 | }
150 |
--------------------------------------------------------------------------------
/Pods/Target Support Files/Pods-MVPSwift/Pods-MVPSwift-frameworks.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 | set -e
3 | set -u
4 | set -o pipefail
5 |
6 | function on_error {
7 | echo "$(realpath -mq "${0}"):$1: error: Unexpected failure"
8 | }
9 | trap 'on_error $LINENO' ERR
10 |
11 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then
12 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy
13 | # frameworks to, so exit 0 (signalling the script phase was successful).
14 | exit 0
15 | fi
16 |
17 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
18 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
19 |
20 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}"
21 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}"
22 | BCSYMBOLMAP_DIR="BCSymbolMaps"
23 |
24 |
25 | # This protects against multiple targets copying the same framework dependency at the same time. The solution
26 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html
27 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????")
28 |
29 | # Copies and strips a vendored framework
30 | install_framework()
31 | {
32 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then
33 | local source="${BUILT_PRODUCTS_DIR}/$1"
34 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then
35 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")"
36 | elif [ -r "$1" ]; then
37 | local source="$1"
38 | fi
39 |
40 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
41 |
42 | if [ -L "${source}" ]; then
43 | echo "Symlinked..."
44 | source="$(readlink "${source}")"
45 | fi
46 |
47 | if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then
48 | # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied
49 | find "${source}/${BCSYMBOLMAP_DIR}" -name "*.bcsymbolmap"|while read f; do
50 | echo "Installing $f"
51 | install_bcsymbolmap "$f" "$destination"
52 | rm "$f"
53 | done
54 | rmdir "${source}/${BCSYMBOLMAP_DIR}"
55 | fi
56 |
57 | # Use filter instead of exclude so missing patterns don't throw errors.
58 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\""
59 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}"
60 |
61 | local basename
62 | basename="$(basename -s .framework "$1")"
63 | binary="${destination}/${basename}.framework/${basename}"
64 |
65 | if ! [ -r "$binary" ]; then
66 | binary="${destination}/${basename}"
67 | elif [ -L "${binary}" ]; then
68 | echo "Destination binary is symlinked..."
69 | dirname="$(dirname "${binary}")"
70 | binary="${dirname}/$(readlink "${binary}")"
71 | fi
72 |
73 | # Strip invalid architectures so "fat" simulator / device frameworks work on device
74 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then
75 | strip_invalid_archs "$binary"
76 | fi
77 |
78 | # Resign the code if required by the build settings to avoid unstable apps
79 | code_sign_if_enabled "${destination}/$(basename "$1")"
80 |
81 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7.
82 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then
83 | local swift_runtime_libs
84 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u)
85 | for lib in $swift_runtime_libs; do
86 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\""
87 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}"
88 | code_sign_if_enabled "${destination}/${lib}"
89 | done
90 | fi
91 | }
92 | # Copies and strips a vendored dSYM
93 | install_dsym() {
94 | local source="$1"
95 | warn_missing_arch=${2:-true}
96 | if [ -r "$source" ]; then
97 | # Copy the dSYM into the targets temp dir.
98 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\""
99 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}"
100 |
101 | local basename
102 | basename="$(basename -s .dSYM "$source")"
103 | binary_name="$(ls "$source/Contents/Resources/DWARF")"
104 | binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}"
105 |
106 | # Strip invalid architectures from the dSYM.
107 | if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then
108 | strip_invalid_archs "$binary" "$warn_missing_arch"
109 | fi
110 | if [[ $STRIP_BINARY_RETVAL == 0 ]]; then
111 | # Move the stripped file into its final destination.
112 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\""
113 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}"
114 | else
115 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing.
116 | mkdir -p "${DWARF_DSYM_FOLDER_PATH}"
117 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM"
118 | fi
119 | fi
120 | }
121 |
122 | # Used as a return value for each invocation of `strip_invalid_archs` function.
123 | STRIP_BINARY_RETVAL=0
124 |
125 | # Strip invalid architectures
126 | strip_invalid_archs() {
127 | binary="$1"
128 | warn_missing_arch=${2:-true}
129 | # Get architectures for current target binary
130 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)"
131 | # Intersect them with the architectures we are building for
132 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)"
133 | # If there are no archs supported by this binary then warn the user
134 | if [[ -z "$intersected_archs" ]]; then
135 | if [[ "$warn_missing_arch" == "true" ]]; then
136 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)."
137 | fi
138 | STRIP_BINARY_RETVAL=1
139 | return
140 | fi
141 | stripped=""
142 | for arch in $binary_archs; do
143 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then
144 | # Strip non-valid architectures in-place
145 | lipo -remove "$arch" -output "$binary" "$binary"
146 | stripped="$stripped $arch"
147 | fi
148 | done
149 | if [[ "$stripped" ]]; then
150 | echo "Stripped $binary of architectures:$stripped"
151 | fi
152 | STRIP_BINARY_RETVAL=0
153 | }
154 |
155 | # Copies the bcsymbolmap files of a vendored framework
156 | install_bcsymbolmap() {
157 | local bcsymbolmap_path="$1"
158 | local destination="${BUILT_PRODUCTS_DIR}"
159 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}""
160 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"
161 | }
162 |
163 | # Signs a framework with the provided identity
164 | code_sign_if_enabled() {
165 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then
166 | # Use the current code_sign_identity
167 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}"
168 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'"
169 |
170 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
171 | code_sign_cmd="$code_sign_cmd &"
172 | fi
173 | echo "$code_sign_cmd"
174 | eval "$code_sign_cmd"
175 | fi
176 | }
177 |
178 | if [[ "$CONFIGURATION" == "Debug" ]]; then
179 | install_framework "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework"
180 | install_framework "${BUILT_PRODUCTS_DIR}/SwiftyJSON/SwiftyJSON.framework"
181 | fi
182 | if [[ "$CONFIGURATION" == "Release" ]]; then
183 | install_framework "${BUILT_PRODUCTS_DIR}/Alamofire/Alamofire.framework"
184 | install_framework "${BUILT_PRODUCTS_DIR}/SwiftyJSON/SwiftyJSON.framework"
185 | fi
186 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then
187 | wait
188 | fi
189 |
--------------------------------------------------------------------------------