├── Example └── AbraExample │ ├── podfile │ ├── AbraExample │ ├── en.lproj │ │ └── InfoPlist.strings │ ├── ABViewController.h │ ├── ABAppDelegate.h │ ├── AbraExample-Prefix.pch │ ├── main.m │ ├── Images.xcassets │ │ ├── AppIcon.appiconset │ │ │ └── Contents.json │ │ └── LaunchImage.launchimage │ │ │ └── Contents.json │ ├── ABViewController.m │ ├── AbraExample-Info.plist │ ├── Base.lproj │ │ └── Main.storyboard │ └── ABAppDelegate.m │ ├── AbraExampleTests │ ├── en.lproj │ │ └── InfoPlist.strings │ ├── AbraExampleTests-Info.plist │ └── AbraExampleTests.m │ ├── Podfile.lock │ └── AbraExample.xcodeproj │ └── project.pbxproj ├── AbraTests ├── en.lproj │ └── InfoPlist.strings ├── ABModelTestNested.m ├── ABModelTestNested.h ├── ABModelTest.m ├── ABModelTest.h ├── AbraTests-Info.plist ├── objects.json └── AbraTests.m ├── podfile ├── Abra ├── Abra-Prefix.pch ├── ABModel+REST.h ├── ABModel+REST.m ├── Abra.h ├── ABModel.h ├── ABAPI.h ├── ABAPI.m ├── ABCache.h ├── ABModel.m └── ABCache.m ├── .gitignore ├── Abra.podspec ├── Podfile.lock ├── README.md └── Abra.xcodeproj └── project.pbxproj /Example/AbraExample/podfile: -------------------------------------------------------------------------------- 1 | platform :ios, '7.0' 2 | pod 'Abra', :path => '../../' -------------------------------------------------------------------------------- /AbraTests/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /podfile: -------------------------------------------------------------------------------- 1 | platform :ios, '7.0' 2 | pod 'AFNetworking' 3 | pod 'Mantle' 4 | 5 | link_with ['Abra', 'AbraTests'] -------------------------------------------------------------------------------- /Example/AbraExample/AbraExample/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /Example/AbraExample/AbraExampleTests/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /Abra/Abra-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header 3 | // 4 | // The contents of this file are implicitly included at the beginning of every source file. 5 | // 6 | 7 | #ifdef __OBJC__ 8 | #import 9 | #endif 10 | -------------------------------------------------------------------------------- /Abra/ABModel+REST.h: -------------------------------------------------------------------------------- 1 | // 2 | // ABModel+REST.h 3 | // Abra 4 | // 5 | // Created by Thomas Ricouard on 25/10/13. 6 | // Copyright (c) 2013 Thomas Ricouard. All rights reserved. 7 | // 8 | 9 | #import "ABModel.h" 10 | 11 | @interface ABModel (REST) 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Abra/ABModel+REST.m: -------------------------------------------------------------------------------- 1 | // 2 | // ABModel+REST.m 3 | // Abra 4 | // 5 | // Created by Thomas Ricouard on 25/10/13. 6 | // Copyright (c) 2013 Thomas Ricouard. All rights reserved. 7 | // 8 | 9 | #import "ABModel+REST.h" 10 | 11 | @implementation ABModel (REST) 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Abra/Abra.h: -------------------------------------------------------------------------------- 1 | // 2 | // Abra.h 3 | // Abra 4 | // 5 | // Created by Thomas Ricouard on 04/10/13. 6 | // Copyright (c) 2013 Thomas Ricouard. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "ABModel+REST.h" 11 | #import "ABAPI.h" 12 | #import "ABCache.h" 13 | -------------------------------------------------------------------------------- /AbraTests/ABModelTestNested.m: -------------------------------------------------------------------------------- 1 | // 2 | // ABModelTestNested.m 3 | // Abra 4 | // 5 | // Created by Thomas Ricouard on 12/10/13. 6 | // Copyright (c) 2013 Thomas Ricouard. All rights reserved. 7 | // 8 | 9 | #import "ABModelTestNested.h" 10 | 11 | @implementation ABModelTestNested 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Example/AbraExample/AbraExample/ABViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ABViewController.h 3 | // AbraExample 4 | // 5 | // Created by Thomas Ricouard on 04/10/13. 6 | // Copyright (c) 2013 Thomas Ricouard. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ABViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | .DS_Store 3 | build/ 4 | *.pbxuser 5 | !default.pbxuser 6 | *.mode1v3 7 | !default.mode1v3 8 | *.mode2v3 9 | !default.mode2v3 10 | *.perspectivev3 11 | !default.perspectivev3 12 | *.xcworkspace 13 | !default.xcworkspace 14 | xcuserdata 15 | profile 16 | *.moved-aside 17 | DerivedData 18 | .idea/ 19 | Example/AbraExample/Pods 20 | Pods/* 21 | -------------------------------------------------------------------------------- /Example/AbraExample/AbraExample/ABAppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // ABAppDelegate.h 3 | // AbraExample 4 | // 5 | // Created by Thomas Ricouard on 04/10/13. 6 | // Copyright (c) 2013 Thomas Ricouard. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ABAppDelegate : UIResponder 12 | 13 | @property (strong, nonatomic) UIWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /Abra/ABModel.h: -------------------------------------------------------------------------------- 1 | // 2 | // ABModel.h 3 | // Abra 4 | // 5 | // Created by Thomas Ricouard on 04/10/13. 6 | // Copyright (c) 2013 Thomas Ricouard. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | #import 12 | 13 | @interface ABModel : MTLModel 14 | 15 | + (Class)classForArrayNamed:(NSString *)arrayName; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /AbraTests/ABModelTestNested.h: -------------------------------------------------------------------------------- 1 | // 2 | // ABModelTestNested.h 3 | // Abra 4 | // 5 | // Created by Thomas Ricouard on 12/10/13. 6 | // Copyright (c) 2013 Thomas Ricouard. All rights reserved. 7 | // 8 | 9 | #import "ABModel.h" 10 | 11 | @interface ABModelTestNested : ABModel 12 | 13 | @property (nonatomic, strong) NSString *uid; 14 | @property (nonatomic, strong) NSURL *url; 15 | @property (nonatomic, strong) NSURL *urlBis; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /Example/AbraExample/AbraExample/AbraExample-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header 3 | // 4 | // The contents of this file are implicitly included at the beginning of every source file. 5 | // 6 | 7 | #import 8 | 9 | #ifndef __IPHONE_5_0 10 | #warning "This project uses features only available in iOS SDK 5.0 and later." 11 | #endif 12 | 13 | #ifdef __OBJC__ 14 | #import 15 | #import 16 | #endif 17 | -------------------------------------------------------------------------------- /Example/AbraExample/AbraExample/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // AbraExample 4 | // 5 | // Created by Thomas Ricouard on 04/10/13. 6 | // Copyright (c) 2013 Thomas Ricouard. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "ABAppDelegate.h" 12 | 13 | int main(int argc, char * argv[]) 14 | { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([ABAppDelegate class])); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /AbraTests/ABModelTest.m: -------------------------------------------------------------------------------- 1 | // 2 | // ABModelTest.m 3 | // Abra 4 | // 5 | // Created by Thomas Ricouard on 12/10/13. 6 | // Copyright (c) 2013 Thomas Ricouard. All rights reserved. 7 | // 8 | 9 | #import "ABModelTest.h" 10 | 11 | @implementation ABModelTest 12 | 13 | + (Class)classForArrayNamed:(NSString *)arrayName 14 | { 15 | if ([arrayName isEqualToString:@"nestedModels"]) { 16 | return ABModelTestNested.class; 17 | } 18 | return nil; 19 | } 20 | 21 | @end 22 | -------------------------------------------------------------------------------- /Example/AbraExample/AbraExample/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "40x40", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "60x60", 16 | "scale" : "2x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /Abra.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = 'Abra' 3 | s.version = '0.0.3' 4 | s.summary = 'Coming soon' 5 | s.homepage = 'https://github.com/Dimillian/Abra' 6 | s.author = { 7 | 'Thomas Ricouard' => 'ricouard77@gmail.com' 8 | } 9 | s.source = { 10 | :git => 'https://github.com/Dimillian/Abra.git', 11 | :tag => '0.0.1' 12 | } 13 | s.platform = :ios, '7.0' 14 | s.public_header_files = 'Abra/*.h' 15 | s.source_files = 'Abra/*.{h,m}' 16 | s.dependency 'AFNetworking' 17 | s.dependency 'Mantle' 18 | s.requires_arc = true 19 | end -------------------------------------------------------------------------------- /Example/AbraExample/AbraExample/Images.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "orientation" : "portrait", 5 | "idiom" : "iphone", 6 | "extent" : "full-screen", 7 | "minimum-system-version" : "7.0", 8 | "scale" : "2x" 9 | }, 10 | { 11 | "orientation" : "portrait", 12 | "idiom" : "iphone", 13 | "subtype" : "retina4", 14 | "extent" : "full-screen", 15 | "minimum-system-version" : "7.0", 16 | "scale" : "2x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /AbraTests/ABModelTest.h: -------------------------------------------------------------------------------- 1 | // 2 | // ABModelTest.h 3 | // Abra 4 | // 5 | // Created by Thomas Ricouard on 12/10/13. 6 | // Copyright (c) 2013 Thomas Ricouard. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "ABModel.h" 11 | #import "ABModelTestNested.h" 12 | 13 | @interface ABModelTest : ABModel 14 | 15 | @property (nonatomic, strong) NSNumber *uid; 16 | @property (nonatomic, strong) NSString *title; 17 | @property (nonatomic, strong) NSDate *postedDate; 18 | @property (nonatomic, strong) NSURL *url; 19 | @property (nonatomic, strong) ABModelTestNested *nestedModel; 20 | @property (nonatomic, strong) NSArray *nestedModels; 21 | 22 | @end 23 | -------------------------------------------------------------------------------- /AbraTests/AbraTests-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | com.thomasricouard.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 1.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Example/AbraExample/AbraExampleTests/AbraExampleTests-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | com.thomasricouard.${PRODUCT_NAME:rfc1034identifier} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundlePackageType 14 | BNDL 15 | CFBundleShortVersionString 16 | 1.0 17 | CFBundleSignature 18 | ???? 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /Example/AbraExample/AbraExampleTests/AbraExampleTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // AbraExampleTests.m 3 | // AbraExampleTests 4 | // 5 | // Created by Thomas Ricouard on 04/10/13. 6 | // Copyright (c) 2013 Thomas Ricouard. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface AbraExampleTests : XCTestCase 12 | 13 | @end 14 | 15 | @implementation AbraExampleTests 16 | 17 | - (void)setUp 18 | { 19 | [super setUp]; 20 | // Put setup code here. This method is called before the invocation of each test method in the class. 21 | } 22 | 23 | - (void)tearDown 24 | { 25 | // Put teardown code here. This method is called after the invocation of each test method in the class. 26 | [super tearDown]; 27 | } 28 | 29 | - (void)testExample 30 | { 31 | XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__); 32 | } 33 | 34 | @end 35 | -------------------------------------------------------------------------------- /AbraTests/objects.json: -------------------------------------------------------------------------------- 1 | { 2 | "uid": 13, 3 | "title": "test", 4 | "postedDate": 672814800, 5 | "url": "http://google.fr", 6 | "nestedModel": { 7 | "uid": 14, 8 | "url": "http://google.fr", 9 | "urlBis": "http://test.com" 10 | }, 11 | "nestedModels": [ 12 | { 13 | "uid": 15, 14 | "url": "http://google.fr", 15 | "urlBis": "http://test.com" 16 | }, 17 | { 18 | "uid": 16, 19 | "url": "http://google.fr", 20 | "urlBis": "http://test.com" 21 | }, 22 | { 23 | "uid": 17, 24 | "url": "http://google.fr", 25 | "urlBis": "http://test.com" 26 | } 27 | ] 28 | } -------------------------------------------------------------------------------- /Example/AbraExample/AbraExample/ABViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ABViewController.m 3 | // AbraExample 4 | // 5 | // Created by Thomas Ricouard on 04/10/13. 6 | // Copyright (c) 2013 Thomas Ricouard. All rights reserved. 7 | // 8 | 9 | #import "ABViewController.h" 10 | #import 11 | 12 | @interface ABViewController () 13 | 14 | @end 15 | 16 | @implementation ABViewController 17 | 18 | - (void)viewDidLoad 19 | { 20 | [super viewDidLoad]; 21 | 22 | [ABAPI setupWithBaseURL:[NSURL URLWithString:@"http://api.twitter.com"]]; 23 | [[ABAPI manager]setReachbilityStatusChangedBlock:^(AFNetworkReachabilityStatus status) { 24 | NSLog(@"%d", status); 25 | }]; 26 | // Do any additional setup after loading the view, typically from a nib. 27 | } 28 | 29 | - (void)didReceiveMemoryWarning 30 | { 31 | [super didReceiveMemoryWarning]; 32 | // Dispose of any resources that can be recreated. 33 | } 34 | 35 | @end 36 | -------------------------------------------------------------------------------- /Abra/ABAPI.h: -------------------------------------------------------------------------------- 1 | // 2 | // ABAPI.h 3 | // Abra 4 | // 5 | // Created by Thomas Ricouard on 12/10/13. 6 | // Copyright (c) 2013 Thomas Ricouard. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | 12 | @interface ABAPI : AFHTTPSessionManager 13 | 14 | /** 15 | If you assign this property, the block will be called whener the network status changed, and you will be notififed with the new status 16 | */ 17 | @property (nonatomic, copy) void (^reachbilityStatusChangedBlock)(AFNetworkReachabilityStatus status); 18 | 19 | /** 20 | You must call this methode once before any request, it will setup the ABAPI singleton for the passes URL 21 | @param URL the base URL of uour API 22 | @return the new initialized ABAPI 23 | */ 24 | + (instancetype)setupWithBaseURL:(NSURL *)URL; 25 | 26 | /** 27 | @return the shared ABAPI object which was setup with your base URL. 28 | */ 29 | + (instancetype)manager; 30 | 31 | @end 32 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - AFNetworking (2.0.1): 3 | - AFNetworking/NSURLConnection 4 | - AFNetworking/NSURLSession 5 | - AFNetworking/Reachability 6 | - AFNetworking/Security 7 | - AFNetworking/Serialization 8 | - AFNetworking/UIKit 9 | - AFNetworking/NSURLConnection (2.0.1): 10 | - AFNetworking/Reachability 11 | - AFNetworking/Security 12 | - AFNetworking/Serialization 13 | - AFNetworking/NSURLSession (2.0.1): 14 | - AFNetworking/Reachability 15 | - AFNetworking/Security 16 | - AFNetworking/Serialization 17 | - AFNetworking/Reachability (2.0.1) 18 | - AFNetworking/Security (2.0.1) 19 | - AFNetworking/Serialization (2.0.1) 20 | - AFNetworking/UIKit (2.0.1): 21 | - AFNetworking/NSURLConnection 22 | - Mantle (1.3): 23 | - Mantle/extobjc 24 | - Mantle/extobjc (1.3) 25 | 26 | DEPENDENCIES: 27 | - AFNetworking 28 | - Mantle 29 | 30 | SPEC CHECKSUMS: 31 | AFNetworking: a6f11ac4ac087303e6ff87adc1ba57b0dac20ef8 32 | Mantle: c3e963daaad6f1418feacce974d789b2d0465539 33 | 34 | COCOAPODS: 0.26.2 35 | -------------------------------------------------------------------------------- /Example/AbraExample/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Abra (0.0.3): 3 | - AFNetworking 4 | - Mantle 5 | - AFNetworking (2.0.1): 6 | - AFNetworking/NSURLConnection 7 | - AFNetworking/NSURLSession 8 | - AFNetworking/Reachability 9 | - AFNetworking/Security 10 | - AFNetworking/Serialization 11 | - AFNetworking/UIKit 12 | - AFNetworking/NSURLConnection (2.0.1): 13 | - AFNetworking/Reachability 14 | - AFNetworking/Security 15 | - AFNetworking/Serialization 16 | - AFNetworking/NSURLSession (2.0.1): 17 | - AFNetworking/Reachability 18 | - AFNetworking/Security 19 | - AFNetworking/Serialization 20 | - AFNetworking/Reachability (2.0.1) 21 | - AFNetworking/Security (2.0.1) 22 | - AFNetworking/Serialization (2.0.1) 23 | - AFNetworking/UIKit (2.0.1): 24 | - AFNetworking/NSURLConnection 25 | - Mantle (1.3): 26 | - Mantle/extobjc 27 | - Mantle/extobjc (1.3) 28 | 29 | DEPENDENCIES: 30 | - Abra (from `../../`) 31 | 32 | EXTERNAL SOURCES: 33 | Abra: 34 | :path: ../../ 35 | 36 | SPEC CHECKSUMS: 37 | Abra: 8bd8aa9c4d9614d40df4060c3be87c84de272850 38 | AFNetworking: a6f11ac4ac087303e6ff87adc1ba57b0dac20ef8 39 | Mantle: c3e963daaad6f1418feacce974d789b2d0465539 40 | 41 | COCOAPODS: 0.26.2 42 | -------------------------------------------------------------------------------- /Example/AbraExample/AbraExample/AbraExample-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | com.thomasricouard.${PRODUCT_NAME:rfc1034identifier} 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSRequiresIPhoneOS 26 | 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /Example/AbraExample/AbraExample/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /Abra/ABAPI.m: -------------------------------------------------------------------------------- 1 | // 2 | // ABAPI.m 3 | // Abra 4 | // 5 | // Created by Thomas Ricouard on 12/10/13. 6 | // Copyright (c) 2013 Thomas Ricouard. All rights reserved. 7 | // 8 | 9 | #import "ABAPI.h" 10 | 11 | static ABAPI *sharedInstance = nil; 12 | 13 | @implementation ABAPI 14 | 15 | 16 | #pragma mark - Setup 17 | 18 | 19 | - (instancetype)initWithBaseURL:(NSURL *)url sessionConfiguration:(NSURLSessionConfiguration *)configuration 20 | { 21 | self = [super initWithBaseURL:url sessionConfiguration:configuration]; 22 | if (self) { 23 | [[NSNotificationCenter defaultCenter]addObserver:self 24 | selector:@selector(onReachabilityChangedNotification:) 25 | name:AFNetworkingReachabilityDidChangeNotification 26 | object:nil]; 27 | } 28 | return self; 29 | } 30 | 31 | + (instancetype)setupWithBaseURL:(NSURL *)URL 32 | { 33 | static dispatch_once_t onceToken; 34 | dispatch_once(&onceToken, ^{ 35 | sharedInstance = [[ABAPI alloc]initWithBaseURL:URL 36 | sessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; 37 | }); 38 | return sharedInstance; 39 | } 40 | 41 | + (instancetype)manager 42 | { 43 | NSAssert(sharedInstance != nil, @"You must first call setupWithBaseURL: before atempting to access the sharedClient"); 44 | return sharedInstance; 45 | } 46 | 47 | 48 | #pragma mark - Reachability 49 | 50 | 51 | - (void)onReachabilityChangedNotification:(NSNotification *)notification 52 | { 53 | if ([notification.name isEqualToString:AFNetworkingReachabilityDidChangeNotification]) { 54 | if (self.reachbilityStatusChangedBlock) { 55 | AFNetworkReachabilityStatus status = 56 | [notification.userInfo[AFNetworkingReachabilityNotificationStatusItem] integerValue]; 57 | self.reachbilityStatusChangedBlock(status); 58 | } 59 | } 60 | } 61 | 62 | @end 63 | -------------------------------------------------------------------------------- /Example/AbraExample/AbraExample/ABAppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // ABAppDelegate.m 3 | // AbraExample 4 | // 5 | // Created by Thomas Ricouard on 04/10/13. 6 | // Copyright (c) 2013 Thomas Ricouard. All rights reserved. 7 | // 8 | 9 | #import "ABAppDelegate.h" 10 | 11 | @implementation ABAppDelegate 12 | 13 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 14 | { 15 | // Override point for customization after application launch. 16 | return YES; 17 | } 18 | 19 | - (void)applicationWillResignActive:(UIApplication *)application 20 | { 21 | // 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. 22 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 23 | } 24 | 25 | - (void)applicationDidEnterBackground:(UIApplication *)application 26 | { 27 | // 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. 28 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 29 | } 30 | 31 | - (void)applicationWillEnterForeground:(UIApplication *)application 32 | { 33 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 34 | } 35 | 36 | - (void)applicationDidBecomeActive:(UIApplication *)application 37 | { 38 | // 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. 39 | } 40 | 41 | - (void)applicationWillTerminate:(UIApplication *)application 42 | { 43 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 44 | } 45 | 46 | @end 47 | -------------------------------------------------------------------------------- /Abra/ABCache.h: -------------------------------------------------------------------------------- 1 | // 2 | // ABCache.h 3 | // Abra 4 | // 5 | // Created by Thomas Ricouard on 12/10/13. 6 | // Copyright (c) 2013 Thomas Ricouard. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ABCache : NSObject 12 | 13 | /** 14 | Creates and returns an `ABCache` object. 15 | */ 16 | + (instancetype)cacheManager; 17 | 18 | /** 19 | REST friendly method to generate a cache key from a path + parameters combinaison. 20 | The final key will look like this path#key1#value1#key2#value2... It should be used when you want to manually cache 21 | and object from an API request 22 | @param path Your API path without the base url, (the same you use to run queries from ABModel). Requiered 23 | @param parameters Your API parameters (the same you use to run queries from ABModel). Optional 24 | @return a key wich represent your path and parameters and which should be safe to use as a cache key 25 | */ 26 | - (NSString *)generateCachekeyWithPath:(NSString *)path parameters:(NSDictionary *)parameters; 27 | 28 | /** 29 | Cache the passed object to the in memory cache and to the disk cache, update any previous occurence. 30 | @param object The object you want to cache. The object must be a subclass of ABModel or conform to . 31 | @param key The key to cache the object (will be the filename too) should be generated from the generateCacheKey method 32 | @return YES if the object was cached with success 33 | */ 34 | - (BOOL)cacheObject:(id)object forKey:(NSString *)key; 35 | 36 | /** 37 | Return the cached object with the associated key (the key should be generated from generateCacheKey method) 38 | The object will first be checked and returned from the in memory cache, if it does not exist here, it will be return from disk cache. 39 | @return An object from in memory cache or disk cache, or nil if the key is not associated with any cached objects. 40 | */ 41 | - (id)cachedObjectForKey:(NSString *)key; 42 | 43 | /** 44 | Cache the passed object to the in memory cache and eventually to disk cache update any previous occurence. 45 | @param object The object you want to cache. The object must be a subclass of ABModel or conform to . 46 | @param key The key to cache the object (will be the filename too) should be generated from the generateCacheKey method 47 | @param inMemory Set to YES if you don't want to persist the passed object to disk 48 | @return YES if the object was cached with success 49 | */ 50 | - (BOOL)cacheObject:(id)object forKey:(NSString *)key onlyToInMemoryCache:(BOOL)inMemory; 51 | 52 | /** 53 | Return the cached object with the associated key (the key should be generated from generateCacheKey method) 54 | The object will first be checked and returned from the in memory cache, if it does not exist here, it will be return from disk. 55 | @param inMemory set to YES if you don't want to check diskCache 56 | @return An object from in memory cache or disk cache, or nil if the key is not associated with any cached objects. 57 | */ 58 | - (id)cachedObjectForKey:(NSString *)key onlyFromInMemoryCache:(BOOL)inMemory; 59 | 60 | /** 61 | Remove every object in the inMemoryCache 62 | */ 63 | - (void)cleanInMemoryCache; 64 | 65 | /** 66 | Remove every object cached on the disk 67 | */ 68 | - (void)cleanDiskCache; 69 | 70 | /** 71 | @return the disk cache folder size 72 | */ 73 | + (unsigned long long)diskCacheSize; 74 | 75 | 76 | 77 | @end 78 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Abra 2 | ==== 3 | 4 | ![image](http://guidesmedia.ign.com/guides/9846/images/abra.gif) 5 | 6 | **Abra** is a **work in progress** framework. In the current version only the cache module is available. It will be released over **Cocoapods** at a later stage. 7 | 8 | #Spec 9 | 10 | **Overview**: **Abra** is a library that aim to simplify the backend/model layer of your application if you use a **RESTful** API. 11 | The end goal is that you should be able to have a working model layer mapped to your API without the need to write any line of code. The only things you'll need is to create your models and add your properties inside. Then you'll be able to do GET/POST/PUT/PATCH/DELETE against any of your model and it will return a correctly initialised instance. (It'll supports arrays of models + nested models) 12 | 13 | Abra is built over already existing libraries, it combine the power of **Mantle** (JSON automatic parsing and more) and **AFNetworking** (Network) and wrap them in something even simpler. 14 | 15 | **Abra is a framework built around 3 modules** 16 | 17 | ##ABModel 18 | 19 | ABModel is the Abra most important component. 20 | All your models that you want to map to some REST path/call should inherit of `ABModel` 21 | As Abra is built around Mantle, it will support any feature you want from it. I invite you to have a look [here](https://github.com/github/Mantle). 22 | 23 | `+ (NSDictionary *)JSONKeyPathsByPropertyKey` 24 | Especially you should implement this method from Mantle if you JSON response have different properties name than your local models. 25 | 26 | ABModel will automatically generate the needed `NSValueTransformer` for your nested models at runtime. But you are in charge to implement your own value transformers if you need to do some operation in some of the values of your JSON response. (NSDate transformation, etc...) 27 | 28 | ##ABCache 29 | 30 | ABCache is a singleton which Abra use for both in memory cache and disk cache. 31 | Models are cached on disk using `` (which is automatically implemented by Mantle). 32 | You don't need to use ABCache directly, it is used by ABAPI when you do a GET request. 33 | ABCache allow Abra to return to you both the cached response (from the in memory store or disk) and then the new response from the API call. And then it'll automatically cache the new response. 34 | 35 | You can look at the header for a more in depth look of the available methods. You can use it as a standalone module if you want. 36 | 37 | Each models that inherit ABModel will provide their GET/POST/PUT/PATCH/DELETE methods, with some variation if you want to do some custom parsing. 38 | The idea is that the only thing to do is to call this method 39 | 40 | ```objc 41 | - (void)getForPath:(NSString *)path 42 | completion:(void(^)(BOOL success, BOOL cached, instanceOrArrayOfInstance))completion; 43 | ``` 44 | A lot of variations of those methods will exist (With parameters, will multiple return block etc..). 45 | 46 | 47 | ###Transformations generated at runtime 48 | #####NSURL 49 | #####Nested model that inherit from ABModel 50 | 51 | ##ABAPI 52 | 53 | **ABAPI** is a subclass of `AFHTTPSessionManager` and provide some useful and Abra specific helpers. 54 | You don't need to use this class directly, the only required things to do is to call the `setupWithBaseURL:` method before attempting any model call. 55 | This class is in charge of the API call/Cache mechanism and logic. ABModel use it extensively. -------------------------------------------------------------------------------- /Abra/ABModel.m: -------------------------------------------------------------------------------- 1 | // 2 | // ABModel.m 3 | // Abra 4 | // 5 | // Created by Thomas Ricouard on 04/10/13. 6 | // Copyright (c) 2013 Thomas Ricouard. All rights reserved. 7 | // 8 | 9 | #import "ABModel.h" 10 | #import 11 | #import 12 | 13 | @implementation ABModel 14 | 15 | + (NSDictionary *)JSONKeyPathsByPropertyKey { 16 | return @{}; 17 | } 18 | 19 | + (BOOL)resolveClassMethod:(SEL)sel 20 | { 21 | NSString *selectorName = NSStringFromSelector(sel); 22 | if ([selectorName hasSuffix:@"JSONTransformer"]) { 23 | NSString *propertyName = [selectorName stringByReplacingOccurrencesOfString:@"JSONTransformer" 24 | withString:@""]; 25 | Class class = [self classForPropertyName:propertyName ofClass:self.class]; 26 | if ([class isSubclassOfClass:[ABModel class]] || class == [NSURL class] || class == [NSArray class]) { 27 | SEL selector = MTLSelectorWithKeyPattern(propertyName, "JSONTransformer"); 28 | NSString *classname = NSStringFromClass([self class]); 29 | Class class = object_getClass(NSClassFromString(classname)); 30 | class_addMethod(class, 31 | selector, 32 | (IMP)JSONValueTransformer, 33 | "@@:"); 34 | } 35 | return YES; 36 | } 37 | return NO; 38 | } 39 | 40 | + (Class)classForPropertyName:(NSString *)propertyName ofClass:(Class)class 41 | { 42 | if (class && propertyName) { 43 | objc_property_t property = class_getProperty(objc_getClass([NSStringFromClass(class) UTF8String]), 44 | [propertyName UTF8String]); 45 | NSString *type = [NSString stringWithFormat:@"%s", property_getAttributes(property)]; 46 | NSArray *attributes = [type componentsSeparatedByString:@","]; 47 | NSString * typeAttribute = [attributes objectAtIndex:0]; 48 | if ([typeAttribute hasPrefix:@"T@"] && [typeAttribute length] > 1) { 49 | NSString * typeClassName = [typeAttribute substringWithRange:NSMakeRange(3, [typeAttribute length]-4)]; 50 | return NSClassFromString(typeClassName); 51 | } 52 | } 53 | return nil; 54 | } 55 | 56 | + (Class)classForArrayNamed:(NSString *)arrayName 57 | { 58 | return nil; 59 | } 60 | 61 | id JSONValueTransformer(id self, SEL _cmd) 62 | { 63 | NSString *propertyName = [NSStringFromSelector(_cmd) stringByReplacingOccurrencesOfString:@"JSONTransformer" 64 | withString:@""]; 65 | return [ABModel dynamicValueTransformer:propertyName forClass:[self class]]; 66 | } 67 | 68 | + (NSValueTransformer *)dynamicValueTransformer:(NSString *)propertyName forClass:(Class)class 69 | { 70 | Class properyClass = [ABModel classForPropertyName:propertyName ofClass:class]; 71 | if ([properyClass isSubclassOfClass:[ABModel class]]) { 72 | return [NSValueTransformer mtl_JSONDictionaryTransformerWithModelClass:[self classForPropertyName:propertyName 73 | ofClass:class]]; 74 | } 75 | else if (properyClass == [NSURL class]) { 76 | return [NSValueTransformer valueTransformerForName:@"MTLURLValueTransformerName"]; 77 | } 78 | else if (properyClass == [NSArray class]) { 79 | Class arrayClass = [ABModel classForArrayNamed:propertyName]; 80 | if (arrayClass) { 81 | return [NSValueTransformer mtl_JSONArrayTransformerWithModelClass:arrayClass]; 82 | } 83 | } 84 | return nil; 85 | } 86 | 87 | @end 88 | -------------------------------------------------------------------------------- /AbraTests/AbraTests.m: -------------------------------------------------------------------------------- 1 | // 2 | // AbraTests.m 3 | // AbraTests 4 | // 5 | // Created by Thomas Ricouard on 04/10/13. 6 | // Copyright (c) 2013 Thomas Ricouard. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "ABModelTest.h" 11 | #import "Abra.h" 12 | #import 13 | #import 14 | #import 15 | 16 | @interface AbraTests : XCTestCase 17 | 18 | 19 | @end 20 | 21 | @implementation AbraTests 22 | 23 | - (void)setUp 24 | { 25 | [super setUp]; 26 | 27 | 28 | 29 | } 30 | 31 | - (void)tearDown 32 | { 33 | [super tearDown]; 34 | } 35 | 36 | - (void)testCache 37 | { 38 | 39 | ABModelTest *testModel = [[ABModelTest alloc]init]; 40 | NSDate *now = [NSDate date]; 41 | NSString *originalTitle = @"New title"; 42 | NSNumber *originalUid = @(123); 43 | testModel.postedDate = now; 44 | testModel.title = originalTitle; 45 | testModel.uid = originalUid; 46 | 47 | NSString *testPath = @"post/users"; 48 | NSDictionary *testParam = @{@"user": @"me", @"filter": @(1), @"all": @(YES)}; 49 | NSString *cacheKey = [[ABCache cacheManager]generateCachekeyWithPath:testPath parameters:testParam]; 50 | 51 | BOOL cached = [[ABCache cacheManager]cacheObject:testModel forKey:cacheKey]; 52 | XCTAssertTrue(cached, @"The object was not cached correctly"); 53 | 54 | NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); 55 | NSString *libraryDirectory = [paths objectAtIndex:0]; 56 | NSString *filePath = [libraryDirectory stringByAppendingPathComponent: 57 | @"Caches/com.thomasricouard.abraDiskCache"]; 58 | filePath = [filePath stringByAppendingPathComponent:cacheKey]; 59 | XCTAssertTrue([[NSFileManager defaultManager]fileExistsAtPath:filePath], 60 | @"The object was not cached correctly, the file doest not exist"); 61 | 62 | ABModelTest *cachedObject = [[ABCache cacheManager]cachedObjectForKey:cacheKey]; 63 | XCTAssertTrue(cachedObject.uid.intValue == testModel.uid.intValue, 64 | @"The cached object uid does not match original object uid"); 65 | XCTAssertTrue([cachedObject.postedDate isEqualToDate:testModel.postedDate], 66 | @"The cached object postedDate does not match original object postedDate"); 67 | XCTAssertTrue([cachedObject.title isEqualToString: testModel.title], 68 | @"The cached object title does not match original object title"); 69 | 70 | [[ABCache cacheManager]cleanInMemoryCache]; 71 | [[ABCache cacheManager]cleanDiskCache]; 72 | 73 | XCTAssertNil([[ABCache cacheManager]cachedObjectForKey:cacheKey 74 | onlyFromInMemoryCache:YES], 75 | @"Memory cache is not cleaned properly"); 76 | XCTAssertFalse([[NSFileManager defaultManager]fileExistsAtPath:filePath], 77 | @"Disk cache is not cleaned properly"); 78 | } 79 | 80 | - (void)testGeneratedMethods 81 | { 82 | ABModelTest *testModel = [[ABModelTest alloc]initWithDictionary:nil error:nil]; 83 | ABModelTestNested *nested = [[ABModelTestNested alloc]initWithDictionary:nil error:nil]; 84 | testModel.nestedModel = nested; 85 | SEL selector = MTLSelectorWithKeyPattern(@"nestedModel", "JSONTransformer"); 86 | XCTAssertTrue([[ABModelTest class] respondsToSelector:selector], @"JSONTransformer method was not created"); 87 | selector = MTLSelectorWithKeyPattern(@"url", "JSONTransformer"); 88 | XCTAssertTrue([[ABModelTest class] respondsToSelector:selector], @"URLTransformer method was not created"); 89 | XCTAssertTrue([[ABModelTestNested class] respondsToSelector:selector], @"URLTransformer method was not created"); 90 | selector = MTLSelectorWithKeyPattern(@"urlBis", "JSONTransformer"); 91 | XCTAssertTrue([[ABModelTestNested class] respondsToSelector:selector], @"URLTransformer method was not created"); 92 | 93 | } 94 | 95 | - (void)testJSONParsing 96 | { 97 | NSBundle *bundle = [NSBundle bundleForClass:[self class]]; 98 | NSString *path = [bundle pathForResource:@"objects" ofType:@"json"]; 99 | NSInputStream *inputStream = [NSInputStream inputStreamWithFileAtPath:path]; 100 | [inputStream open]; 101 | NSError *error; 102 | NSJSONSerialization *json = [NSJSONSerialization JSONObjectWithStream:inputStream 103 | options:NSJSONReadingAllowFragments 104 | error:&error]; 105 | [inputStream close]; 106 | XCTAssertNil(error, @"Error while reading the JSON file"); 107 | XCTAssertNotNil(json, @"Error while reading the JSON file"); 108 | error = nil; 109 | ABModelTest *test = [MTLJSONAdapter modelOfClass:ABModelTest.class 110 | fromJSONDictionary:(NSDictionary *)json 111 | error:&error]; 112 | XCTAssertNil(error, @"Error while parsing the JSON"); 113 | XCTAssertNotNil(test, @"Error while parsing the JSON"); 114 | XCTAssertTrue(test.uid.integerValue == 13, @"Parsed object uid is false"); 115 | XCTAssertTrue(test.nestedModels.count == 3, @"Parsed object nested models was not parsed"); 116 | XCTAssertTrue(test.nestedModel.uid.integerValue == 14, @"Pased object nested model uid is false"); 117 | } 118 | 119 | 120 | @end 121 | -------------------------------------------------------------------------------- /Abra/ABCache.m: -------------------------------------------------------------------------------- 1 | // 2 | // ABCache.m 3 | // Abra 4 | // 5 | // Created by Thomas Ricouard on 12/10/13. 6 | // Copyright (c) 2013 Thomas Ricouard. All rights reserved. 7 | // 8 | 9 | #import "ABCache.h" 10 | 11 | NSString * const kInMemoryCacheName = @"com.thomasricouard.abraCache"; 12 | NSString * const kDiskCachePath = @"com.thomasricouard.abraDiskCache"; 13 | 14 | @interface ABCache () 15 | 16 | @property (nonatomic, strong) NSCache *inMemoryCache; 17 | @property (nonatomic, strong, readonly) NSString *filePath; 18 | 19 | - (BOOL)archiveObject:(id)object withFilename:(NSString *)filename; 20 | - (id)unarchiveObjectWithFilename:(NSString *)filename; 21 | - (BOOL)existAtFilepath:(NSString *)filename; 22 | - (void)createCacheFolderIfNotExist; 23 | 24 | @end 25 | 26 | @implementation ABCache 27 | 28 | 29 | #pragma mark - Setup 30 | 31 | 32 | + (instancetype)cacheManager 33 | { 34 | static ABCache *cacheInstance = nil; 35 | static dispatch_once_t onceToken; 36 | dispatch_once(&onceToken, ^{ 37 | cacheInstance = [[ABCache alloc]init]; 38 | }); 39 | return cacheInstance; 40 | } 41 | 42 | - (id)init 43 | { 44 | self = [super init]; 45 | if (self) { 46 | _inMemoryCache = [[NSCache alloc]init]; 47 | [self.inMemoryCache setName:kInMemoryCacheName]; 48 | [self createCacheFolderIfNotExist]; 49 | } 50 | return self; 51 | } 52 | 53 | 54 | #pragma mark - Exposed methods 55 | 56 | 57 | - (NSString *)generateCachekeyWithPath:(NSString *)path parameters:(NSDictionary *)parameters 58 | { 59 | __block NSString *key = [path stringByReplacingOccurrencesOfString:@"/" withString:@"#"]; 60 | 61 | if (parameters) { 62 | dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0ul), ^{ 63 | [parameters enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { 64 | key = [key stringByAppendingString:[NSString stringWithFormat:@"#%@#%@", key, obj]]; 65 | }]; 66 | }); 67 | } 68 | return key; 69 | } 70 | 71 | - (BOOL)cacheObject:(id)object forKey:(NSString *)key 72 | { 73 | return [self cacheObject:object forKey:key onlyToInMemoryCache:NO]; 74 | } 75 | 76 | - (BOOL)cacheObject:(id)object forKey:(NSString *)key onlyToInMemoryCache:(BOOL)inMemory 77 | { 78 | [self.inMemoryCache setObject:object forKey:key]; 79 | if (!inMemory) { 80 | return [self archiveObject:object withFilename:key]; 81 | } 82 | return YES; 83 | } 84 | 85 | - (id)cachedObjectForKey:(NSString *)key 86 | { 87 | return [self cachedObjectForKey:key onlyFromInMemoryCache:NO]; 88 | } 89 | 90 | - (id)cachedObjectForKey:(NSString *)key onlyFromInMemoryCache:(BOOL)inMemory 91 | { 92 | id object = [self.inMemoryCache objectForKey:key]; 93 | if (!object && !inMemory) { 94 | object = [self unarchiveObjectWithFilename:key]; 95 | } 96 | if (object) { 97 | [self.inMemoryCache setObject:object forKey:key]; 98 | } 99 | return object; 100 | } 101 | 102 | - (void)cleanDiskCache 103 | { 104 | NSError *error = nil; 105 | for (NSString *file in [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[ABCache cacheManager].filePath 106 | error:&error]) { 107 | [[NSFileManager defaultManager] removeItemAtPath:[[ABCache cacheManager].filePath 108 | stringByAppendingPathComponent:file] 109 | error:&error]; 110 | } 111 | } 112 | 113 | - (void)cleanInMemoryCache 114 | { 115 | if (self.inMemoryCache) { 116 | [self.inMemoryCache removeAllObjects]; 117 | _inMemoryCache = [[NSCache alloc]init]; 118 | } 119 | } 120 | 121 | 122 | + (unsigned long long)diskCacheSize 123 | { 124 | NSDictionary *fileAttributes = [[NSFileManager defaultManager]attributesOfItemAtPath:[ABCache cacheManager].filePath 125 | error:nil]; 126 | return [fileAttributes fileSize]; 127 | } 128 | 129 | 130 | #pragma mark - Private methods 131 | 132 | 133 | - (BOOL)archiveObject:(id)object withFilename:(NSString *)filename 134 | { 135 | NSString *fullPath = [self.filePath stringByAppendingPathComponent:filename]; 136 | return [NSKeyedArchiver archiveRootObject:object toFile:fullPath]; 137 | } 138 | 139 | - (id)unarchiveObjectWithFilename:(NSString *)filename 140 | { 141 | NSString *filepath = [self.filePath stringByAppendingString:filename]; 142 | if ([self existAtFilepath:filepath]) { 143 | return [NSKeyedUnarchiver unarchiveObjectWithFile:filepath]; 144 | } 145 | return nil; 146 | } 147 | 148 | - (BOOL)existAtFilepath:(NSString *)filename 149 | { 150 | NSFileManager *fileManager = [NSFileManager defaultManager]; 151 | return [fileManager fileExistsAtPath:filename]; 152 | } 153 | 154 | - (NSString *)filePath 155 | { 156 | static NSString *filePath = nil; 157 | static dispatch_once_t onceToken; 158 | dispatch_once(&onceToken, ^{ 159 | NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); 160 | NSString *libraryDirectory = [paths objectAtIndex:0]; 161 | filePath = [libraryDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"Caches/%@", kDiskCachePath]]; 162 | }); 163 | return filePath; 164 | 165 | } 166 | 167 | - (void)createCacheFolderIfNotExist 168 | { 169 | if (![self existAtFilepath:[self filePath]]) { 170 | NSError *fileError; 171 | [[NSFileManager defaultManager]createDirectoryAtPath:[self filePath] 172 | withIntermediateDirectories:NO 173 | attributes:nil 174 | error:&fileError]; 175 | } 176 | } 177 | 178 | @end 179 | -------------------------------------------------------------------------------- /Abra.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 9108264A527347A19FBBDA34 /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E97DAFAA54E340D89FAF18C6 /* libPods.a */; }; 11 | 9F49AA2B1809938400349097 /* ABAPI.m in Sources */ = {isa = PBXBuildFile; fileRef = 9F49AA2A1809938400349097 /* ABAPI.m */; }; 12 | 9F49AA2F180993D800349097 /* ABModelTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 9F49AA2E180993D800349097 /* ABModelTest.m */; }; 13 | 9F49AA32180994AB00349097 /* ABModelTestNested.m in Sources */ = {isa = PBXBuildFile; fileRef = 9F49AA31180994AB00349097 /* ABModelTestNested.m */; }; 14 | 9F49AA351809951800349097 /* ABCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 9F49AA341809951800349097 /* ABCache.m */; }; 15 | 9F91A4C1181A943700007CC8 /* objects.json in Resources */ = {isa = PBXBuildFile; fileRef = 9F91A4C0181A943700007CC8 /* objects.json */; }; 16 | 9F91A4C6181AADAF00007CC8 /* ABModel+REST.m in Sources */ = {isa = PBXBuildFile; fileRef = 9F91A4C5181AADAF00007CC8 /* ABModel+REST.m */; }; 17 | 9FBE10E417FF00FA007C983B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FBE10E317FF00FA007C983B /* Foundation.framework */; }; 18 | 9FBE10E917FF00FA007C983B /* Abra.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 9FBE10E817FF00FA007C983B /* Abra.h */; }; 19 | 9FBE10F217FF00FA007C983B /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FBE10F117FF00FA007C983B /* XCTest.framework */; }; 20 | 9FBE10F317FF00FA007C983B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FBE10E317FF00FA007C983B /* Foundation.framework */; }; 21 | 9FBE10F517FF00FA007C983B /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FBE10F417FF00FA007C983B /* UIKit.framework */; }; 22 | 9FBE10F817FF00FA007C983B /* libAbra.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9FBE10E017FF00FA007C983B /* libAbra.a */; }; 23 | 9FBE10FE17FF00FA007C983B /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 9FBE10FC17FF00FA007C983B /* InfoPlist.strings */; }; 24 | 9FBE110017FF00FA007C983B /* AbraTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FBE10FF17FF00FA007C983B /* AbraTests.m */; }; 25 | 9FBE114C17FF05C3007C983B /* ABModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 9FBE114B17FF05C3007C983B /* ABModel.m */; }; 26 | /* End PBXBuildFile section */ 27 | 28 | /* Begin PBXContainerItemProxy section */ 29 | 9FBE10F617FF00FA007C983B /* PBXContainerItemProxy */ = { 30 | isa = PBXContainerItemProxy; 31 | containerPortal = 9FBE10D817FF00FA007C983B /* Project object */; 32 | proxyType = 1; 33 | remoteGlobalIDString = 9FBE10DF17FF00FA007C983B; 34 | remoteInfo = Abra; 35 | }; 36 | /* End PBXContainerItemProxy section */ 37 | 38 | /* Begin PBXCopyFilesBuildPhase section */ 39 | 9FBE10DE17FF00FA007C983B /* CopyFiles */ = { 40 | isa = PBXCopyFilesBuildPhase; 41 | buildActionMask = 2147483647; 42 | dstPath = "include/$(PRODUCT_NAME)"; 43 | dstSubfolderSpec = 16; 44 | files = ( 45 | 9FBE10E917FF00FA007C983B /* Abra.h in CopyFiles */, 46 | ); 47 | runOnlyForDeploymentPostprocessing = 0; 48 | }; 49 | /* End PBXCopyFilesBuildPhase section */ 50 | 51 | /* Begin PBXFileReference section */ 52 | 9F49AA291809938400349097 /* ABAPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ABAPI.h; sourceTree = ""; }; 53 | 9F49AA2A1809938400349097 /* ABAPI.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ABAPI.m; sourceTree = ""; }; 54 | 9F49AA2D180993D800349097 /* ABModelTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ABModelTest.h; sourceTree = ""; }; 55 | 9F49AA2E180993D800349097 /* ABModelTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ABModelTest.m; sourceTree = ""; }; 56 | 9F49AA30180994AB00349097 /* ABModelTestNested.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ABModelTestNested.h; sourceTree = ""; }; 57 | 9F49AA31180994AB00349097 /* ABModelTestNested.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ABModelTestNested.m; sourceTree = ""; }; 58 | 9F49AA331809951800349097 /* ABCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ABCache.h; sourceTree = ""; }; 59 | 9F49AA341809951800349097 /* ABCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ABCache.m; sourceTree = ""; }; 60 | 9F91A4C0181A943700007CC8 /* objects.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = objects.json; sourceTree = ""; }; 61 | 9F91A4C4181AADAF00007CC8 /* ABModel+REST.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ABModel+REST.h"; sourceTree = ""; }; 62 | 9F91A4C5181AADAF00007CC8 /* ABModel+REST.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "ABModel+REST.m"; sourceTree = ""; }; 63 | 9FBE10E017FF00FA007C983B /* libAbra.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libAbra.a; sourceTree = BUILT_PRODUCTS_DIR; }; 64 | 9FBE10E317FF00FA007C983B /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 65 | 9FBE10E717FF00FA007C983B /* Abra-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Abra-Prefix.pch"; sourceTree = ""; }; 66 | 9FBE10E817FF00FA007C983B /* Abra.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Abra.h; sourceTree = ""; }; 67 | 9FBE10F017FF00FA007C983B /* AbraTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AbraTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 68 | 9FBE10F117FF00FA007C983B /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 69 | 9FBE10F417FF00FA007C983B /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; 70 | 9FBE10FB17FF00FA007C983B /* AbraTests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "AbraTests-Info.plist"; sourceTree = ""; }; 71 | 9FBE10FD17FF00FA007C983B /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 72 | 9FBE10FF17FF00FA007C983B /* AbraTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AbraTests.m; sourceTree = ""; }; 73 | 9FBE114A17FF05C3007C983B /* ABModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ABModel.h; sourceTree = ""; }; 74 | 9FBE114B17FF05C3007C983B /* ABModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ABModel.m; sourceTree = ""; }; 75 | E0BAA7131DBC4E8ABDED1B58 /* Pods.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.xcconfig; path = Pods/Pods.xcconfig; sourceTree = ""; }; 76 | E97DAFAA54E340D89FAF18C6 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; 77 | /* End PBXFileReference section */ 78 | 79 | /* Begin PBXFrameworksBuildPhase section */ 80 | 9FBE10DD17FF00FA007C983B /* Frameworks */ = { 81 | isa = PBXFrameworksBuildPhase; 82 | buildActionMask = 2147483647; 83 | files = ( 84 | 9FBE10E417FF00FA007C983B /* Foundation.framework in Frameworks */, 85 | ); 86 | runOnlyForDeploymentPostprocessing = 0; 87 | }; 88 | 9FBE10ED17FF00FA007C983B /* Frameworks */ = { 89 | isa = PBXFrameworksBuildPhase; 90 | buildActionMask = 2147483647; 91 | files = ( 92 | 9FBE10F217FF00FA007C983B /* XCTest.framework in Frameworks */, 93 | 9FBE10F817FF00FA007C983B /* libAbra.a in Frameworks */, 94 | 9FBE10F517FF00FA007C983B /* UIKit.framework in Frameworks */, 95 | 9FBE10F317FF00FA007C983B /* Foundation.framework in Frameworks */, 96 | 9108264A527347A19FBBDA34 /* libPods.a in Frameworks */, 97 | ); 98 | runOnlyForDeploymentPostprocessing = 0; 99 | }; 100 | /* End PBXFrameworksBuildPhase section */ 101 | 102 | /* Begin PBXGroup section */ 103 | 9F49AA2C180993CC00349097 /* TestModel */ = { 104 | isa = PBXGroup; 105 | children = ( 106 | 9F49AA2D180993D800349097 /* ABModelTest.h */, 107 | 9F49AA2E180993D800349097 /* ABModelTest.m */, 108 | 9F49AA30180994AB00349097 /* ABModelTestNested.h */, 109 | 9F49AA31180994AB00349097 /* ABModelTestNested.m */, 110 | ); 111 | name = TestModel; 112 | sourceTree = ""; 113 | }; 114 | 9FBE10D717FF00FA007C983B = { 115 | isa = PBXGroup; 116 | children = ( 117 | 9FBE10E517FF00FA007C983B /* Abra */, 118 | 9FBE10F917FF00FA007C983B /* AbraTests */, 119 | 9FBE10E217FF00FA007C983B /* Frameworks */, 120 | 9FBE10E117FF00FA007C983B /* Products */, 121 | E0BAA7131DBC4E8ABDED1B58 /* Pods.xcconfig */, 122 | ); 123 | sourceTree = ""; 124 | }; 125 | 9FBE10E117FF00FA007C983B /* Products */ = { 126 | isa = PBXGroup; 127 | children = ( 128 | 9FBE10E017FF00FA007C983B /* libAbra.a */, 129 | 9FBE10F017FF00FA007C983B /* AbraTests.xctest */, 130 | ); 131 | name = Products; 132 | sourceTree = ""; 133 | }; 134 | 9FBE10E217FF00FA007C983B /* Frameworks */ = { 135 | isa = PBXGroup; 136 | children = ( 137 | 9FBE10E317FF00FA007C983B /* Foundation.framework */, 138 | 9FBE10F117FF00FA007C983B /* XCTest.framework */, 139 | 9FBE10F417FF00FA007C983B /* UIKit.framework */, 140 | E97DAFAA54E340D89FAF18C6 /* libPods.a */, 141 | ); 142 | name = Frameworks; 143 | sourceTree = ""; 144 | }; 145 | 9FBE10E517FF00FA007C983B /* Abra */ = { 146 | isa = PBXGroup; 147 | children = ( 148 | 9FBE10E817FF00FA007C983B /* Abra.h */, 149 | 9F49AA331809951800349097 /* ABCache.h */, 150 | 9F49AA341809951800349097 /* ABCache.m */, 151 | 9F49AA291809938400349097 /* ABAPI.h */, 152 | 9F49AA2A1809938400349097 /* ABAPI.m */, 153 | 9FBE114A17FF05C3007C983B /* ABModel.h */, 154 | 9FBE114B17FF05C3007C983B /* ABModel.m */, 155 | 9F91A4C4181AADAF00007CC8 /* ABModel+REST.h */, 156 | 9F91A4C5181AADAF00007CC8 /* ABModel+REST.m */, 157 | 9FBE10E617FF00FA007C983B /* Supporting Files */, 158 | ); 159 | path = Abra; 160 | sourceTree = ""; 161 | }; 162 | 9FBE10E617FF00FA007C983B /* Supporting Files */ = { 163 | isa = PBXGroup; 164 | children = ( 165 | 9FBE10E717FF00FA007C983B /* Abra-Prefix.pch */, 166 | ); 167 | name = "Supporting Files"; 168 | sourceTree = ""; 169 | }; 170 | 9FBE10F917FF00FA007C983B /* AbraTests */ = { 171 | isa = PBXGroup; 172 | children = ( 173 | 9F49AA2C180993CC00349097 /* TestModel */, 174 | 9FBE10FF17FF00FA007C983B /* AbraTests.m */, 175 | 9FBE10FA17FF00FA007C983B /* Supporting Files */, 176 | ); 177 | path = AbraTests; 178 | sourceTree = ""; 179 | }; 180 | 9FBE10FA17FF00FA007C983B /* Supporting Files */ = { 181 | isa = PBXGroup; 182 | children = ( 183 | 9FBE10FB17FF00FA007C983B /* AbraTests-Info.plist */, 184 | 9FBE10FC17FF00FA007C983B /* InfoPlist.strings */, 185 | 9F91A4C0181A943700007CC8 /* objects.json */, 186 | ); 187 | name = "Supporting Files"; 188 | sourceTree = ""; 189 | }; 190 | /* End PBXGroup section */ 191 | 192 | /* Begin PBXNativeTarget section */ 193 | 9FBE10DF17FF00FA007C983B /* Abra */ = { 194 | isa = PBXNativeTarget; 195 | buildConfigurationList = 9FBE110317FF00FA007C983B /* Build configuration list for PBXNativeTarget "Abra" */; 196 | buildPhases = ( 197 | 716674C2B6EC4BE098656F44 /* Check Pods Manifest.lock */, 198 | 9FBE10DC17FF00FA007C983B /* Sources */, 199 | 9FBE10DD17FF00FA007C983B /* Frameworks */, 200 | 9FBE10DE17FF00FA007C983B /* CopyFiles */, 201 | A7E0EA46369C40909F70C3C2 /* Copy Pods Resources */, 202 | ); 203 | buildRules = ( 204 | ); 205 | dependencies = ( 206 | ); 207 | name = Abra; 208 | productName = Abra; 209 | productReference = 9FBE10E017FF00FA007C983B /* libAbra.a */; 210 | productType = "com.apple.product-type.library.static"; 211 | }; 212 | 9FBE10EF17FF00FA007C983B /* AbraTests */ = { 213 | isa = PBXNativeTarget; 214 | buildConfigurationList = 9FBE110617FF00FA007C983B /* Build configuration list for PBXNativeTarget "AbraTests" */; 215 | buildPhases = ( 216 | 7E199519DE43484FA08366A2 /* Check Pods Manifest.lock */, 217 | 9FBE10EC17FF00FA007C983B /* Sources */, 218 | 9FBE10ED17FF00FA007C983B /* Frameworks */, 219 | 9FBE10EE17FF00FA007C983B /* Resources */, 220 | 8FDCF35922E14FFCBF16DF30 /* Copy Pods Resources */, 221 | ); 222 | buildRules = ( 223 | ); 224 | dependencies = ( 225 | 9FBE10F717FF00FA007C983B /* PBXTargetDependency */, 226 | ); 227 | name = AbraTests; 228 | productName = AbraTests; 229 | productReference = 9FBE10F017FF00FA007C983B /* AbraTests.xctest */; 230 | productType = "com.apple.product-type.bundle.unit-test"; 231 | }; 232 | /* End PBXNativeTarget section */ 233 | 234 | /* Begin PBXProject section */ 235 | 9FBE10D817FF00FA007C983B /* Project object */ = { 236 | isa = PBXProject; 237 | attributes = { 238 | LastUpgradeCheck = 0500; 239 | ORGANIZATIONNAME = "Thomas Ricouard"; 240 | }; 241 | buildConfigurationList = 9FBE10DB17FF00FA007C983B /* Build configuration list for PBXProject "Abra" */; 242 | compatibilityVersion = "Xcode 3.2"; 243 | developmentRegion = English; 244 | hasScannedForEncodings = 0; 245 | knownRegions = ( 246 | en, 247 | ); 248 | mainGroup = 9FBE10D717FF00FA007C983B; 249 | productRefGroup = 9FBE10E117FF00FA007C983B /* Products */; 250 | projectDirPath = ""; 251 | projectRoot = ""; 252 | targets = ( 253 | 9FBE10DF17FF00FA007C983B /* Abra */, 254 | 9FBE10EF17FF00FA007C983B /* AbraTests */, 255 | ); 256 | }; 257 | /* End PBXProject section */ 258 | 259 | /* Begin PBXResourcesBuildPhase section */ 260 | 9FBE10EE17FF00FA007C983B /* Resources */ = { 261 | isa = PBXResourcesBuildPhase; 262 | buildActionMask = 2147483647; 263 | files = ( 264 | 9F91A4C1181A943700007CC8 /* objects.json in Resources */, 265 | 9FBE10FE17FF00FA007C983B /* InfoPlist.strings in Resources */, 266 | ); 267 | runOnlyForDeploymentPostprocessing = 0; 268 | }; 269 | /* End PBXResourcesBuildPhase section */ 270 | 271 | /* Begin PBXShellScriptBuildPhase section */ 272 | 716674C2B6EC4BE098656F44 /* Check Pods Manifest.lock */ = { 273 | isa = PBXShellScriptBuildPhase; 274 | buildActionMask = 2147483647; 275 | files = ( 276 | ); 277 | inputPaths = ( 278 | ); 279 | name = "Check Pods Manifest.lock"; 280 | outputPaths = ( 281 | ); 282 | runOnlyForDeploymentPostprocessing = 0; 283 | shellPath = /bin/sh; 284 | shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; 285 | showEnvVarsInLog = 0; 286 | }; 287 | 7E199519DE43484FA08366A2 /* Check Pods Manifest.lock */ = { 288 | isa = PBXShellScriptBuildPhase; 289 | buildActionMask = 2147483647; 290 | files = ( 291 | ); 292 | inputPaths = ( 293 | ); 294 | name = "Check Pods Manifest.lock"; 295 | outputPaths = ( 296 | ); 297 | runOnlyForDeploymentPostprocessing = 0; 298 | shellPath = /bin/sh; 299 | shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; 300 | showEnvVarsInLog = 0; 301 | }; 302 | 8FDCF35922E14FFCBF16DF30 /* Copy Pods Resources */ = { 303 | isa = PBXShellScriptBuildPhase; 304 | buildActionMask = 2147483647; 305 | files = ( 306 | ); 307 | inputPaths = ( 308 | ); 309 | name = "Copy Pods Resources"; 310 | outputPaths = ( 311 | ); 312 | runOnlyForDeploymentPostprocessing = 0; 313 | shellPath = /bin/sh; 314 | shellScript = "\"${SRCROOT}/Pods/Pods-resources.sh\"\n"; 315 | showEnvVarsInLog = 0; 316 | }; 317 | A7E0EA46369C40909F70C3C2 /* Copy Pods Resources */ = { 318 | isa = PBXShellScriptBuildPhase; 319 | buildActionMask = 2147483647; 320 | files = ( 321 | ); 322 | inputPaths = ( 323 | ); 324 | name = "Copy Pods Resources"; 325 | outputPaths = ( 326 | ); 327 | runOnlyForDeploymentPostprocessing = 0; 328 | shellPath = /bin/sh; 329 | shellScript = "\"${SRCROOT}/Pods/Pods-resources.sh\"\n"; 330 | showEnvVarsInLog = 0; 331 | }; 332 | /* End PBXShellScriptBuildPhase section */ 333 | 334 | /* Begin PBXSourcesBuildPhase section */ 335 | 9FBE10DC17FF00FA007C983B /* Sources */ = { 336 | isa = PBXSourcesBuildPhase; 337 | buildActionMask = 2147483647; 338 | files = ( 339 | 9FBE114C17FF05C3007C983B /* ABModel.m in Sources */, 340 | 9F49AA351809951800349097 /* ABCache.m in Sources */, 341 | 9F91A4C6181AADAF00007CC8 /* ABModel+REST.m in Sources */, 342 | 9F49AA2B1809938400349097 /* ABAPI.m in Sources */, 343 | ); 344 | runOnlyForDeploymentPostprocessing = 0; 345 | }; 346 | 9FBE10EC17FF00FA007C983B /* Sources */ = { 347 | isa = PBXSourcesBuildPhase; 348 | buildActionMask = 2147483647; 349 | files = ( 350 | 9F49AA2F180993D800349097 /* ABModelTest.m in Sources */, 351 | 9F49AA32180994AB00349097 /* ABModelTestNested.m in Sources */, 352 | 9FBE110017FF00FA007C983B /* AbraTests.m in Sources */, 353 | ); 354 | runOnlyForDeploymentPostprocessing = 0; 355 | }; 356 | /* End PBXSourcesBuildPhase section */ 357 | 358 | /* Begin PBXTargetDependency section */ 359 | 9FBE10F717FF00FA007C983B /* PBXTargetDependency */ = { 360 | isa = PBXTargetDependency; 361 | target = 9FBE10DF17FF00FA007C983B /* Abra */; 362 | targetProxy = 9FBE10F617FF00FA007C983B /* PBXContainerItemProxy */; 363 | }; 364 | /* End PBXTargetDependency section */ 365 | 366 | /* Begin PBXVariantGroup section */ 367 | 9FBE10FC17FF00FA007C983B /* InfoPlist.strings */ = { 368 | isa = PBXVariantGroup; 369 | children = ( 370 | 9FBE10FD17FF00FA007C983B /* en */, 371 | ); 372 | name = InfoPlist.strings; 373 | sourceTree = ""; 374 | }; 375 | /* End PBXVariantGroup section */ 376 | 377 | /* Begin XCBuildConfiguration section */ 378 | 9FBE110117FF00FA007C983B /* Debug */ = { 379 | isa = XCBuildConfiguration; 380 | buildSettings = { 381 | ALWAYS_SEARCH_USER_PATHS = NO; 382 | ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; 383 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 384 | CLANG_CXX_LIBRARY = "libc++"; 385 | CLANG_ENABLE_MODULES = YES; 386 | CLANG_ENABLE_OBJC_ARC = YES; 387 | CLANG_WARN_BOOL_CONVERSION = YES; 388 | CLANG_WARN_CONSTANT_CONVERSION = YES; 389 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 390 | CLANG_WARN_EMPTY_BODY = YES; 391 | CLANG_WARN_ENUM_CONVERSION = YES; 392 | CLANG_WARN_INT_CONVERSION = YES; 393 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 394 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 395 | COPY_PHASE_STRIP = NO; 396 | GCC_C_LANGUAGE_STANDARD = gnu99; 397 | GCC_DYNAMIC_NO_PIC = NO; 398 | GCC_OPTIMIZATION_LEVEL = 0; 399 | GCC_PREPROCESSOR_DEFINITIONS = ( 400 | "DEBUG=1", 401 | "$(inherited)", 402 | ); 403 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 404 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 405 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 406 | GCC_WARN_UNDECLARED_SELECTOR = YES; 407 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 408 | GCC_WARN_UNUSED_FUNCTION = YES; 409 | GCC_WARN_UNUSED_VARIABLE = YES; 410 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 411 | ONLY_ACTIVE_ARCH = YES; 412 | SDKROOT = iphoneos; 413 | }; 414 | name = Debug; 415 | }; 416 | 9FBE110217FF00FA007C983B /* Release */ = { 417 | isa = XCBuildConfiguration; 418 | buildSettings = { 419 | ALWAYS_SEARCH_USER_PATHS = NO; 420 | ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; 421 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 422 | CLANG_CXX_LIBRARY = "libc++"; 423 | CLANG_ENABLE_MODULES = YES; 424 | CLANG_ENABLE_OBJC_ARC = YES; 425 | CLANG_WARN_BOOL_CONVERSION = YES; 426 | CLANG_WARN_CONSTANT_CONVERSION = YES; 427 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 428 | CLANG_WARN_EMPTY_BODY = YES; 429 | CLANG_WARN_ENUM_CONVERSION = YES; 430 | CLANG_WARN_INT_CONVERSION = YES; 431 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 432 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 433 | COPY_PHASE_STRIP = YES; 434 | ENABLE_NS_ASSERTIONS = NO; 435 | GCC_C_LANGUAGE_STANDARD = gnu99; 436 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 437 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 438 | GCC_WARN_UNDECLARED_SELECTOR = YES; 439 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 440 | GCC_WARN_UNUSED_FUNCTION = YES; 441 | GCC_WARN_UNUSED_VARIABLE = YES; 442 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 443 | SDKROOT = iphoneos; 444 | VALIDATE_PRODUCT = YES; 445 | }; 446 | name = Release; 447 | }; 448 | 9FBE110417FF00FA007C983B /* Debug */ = { 449 | isa = XCBuildConfiguration; 450 | baseConfigurationReference = E0BAA7131DBC4E8ABDED1B58 /* Pods.xcconfig */; 451 | buildSettings = { 452 | DSTROOT = /tmp/Abra.dst; 453 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 454 | GCC_PREFIX_HEADER = "Abra/Abra-Prefix.pch"; 455 | OTHER_LDFLAGS = "$(inherited)"; 456 | PRODUCT_NAME = "$(TARGET_NAME)"; 457 | SKIP_INSTALL = YES; 458 | }; 459 | name = Debug; 460 | }; 461 | 9FBE110517FF00FA007C983B /* Release */ = { 462 | isa = XCBuildConfiguration; 463 | baseConfigurationReference = E0BAA7131DBC4E8ABDED1B58 /* Pods.xcconfig */; 464 | buildSettings = { 465 | DSTROOT = /tmp/Abra.dst; 466 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 467 | GCC_PREFIX_HEADER = "Abra/Abra-Prefix.pch"; 468 | OTHER_LDFLAGS = "$(inherited)"; 469 | PRODUCT_NAME = "$(TARGET_NAME)"; 470 | SKIP_INSTALL = YES; 471 | }; 472 | name = Release; 473 | }; 474 | 9FBE110717FF00FA007C983B /* Debug */ = { 475 | isa = XCBuildConfiguration; 476 | baseConfigurationReference = E0BAA7131DBC4E8ABDED1B58 /* Pods.xcconfig */; 477 | buildSettings = { 478 | ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; 479 | FRAMEWORK_SEARCH_PATHS = ( 480 | "$(SDKROOT)/Developer/Library/Frameworks", 481 | "$(inherited)", 482 | "$(DEVELOPER_FRAMEWORKS_DIR)", 483 | ); 484 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 485 | GCC_PREFIX_HEADER = "Abra/Abra-Prefix.pch"; 486 | GCC_PREPROCESSOR_DEFINITIONS = ( 487 | "DEBUG=1", 488 | "$(inherited)", 489 | ); 490 | INFOPLIST_FILE = "AbraTests/AbraTests-Info.plist"; 491 | PRODUCT_NAME = "$(TARGET_NAME)"; 492 | WRAPPER_EXTENSION = xctest; 493 | }; 494 | name = Debug; 495 | }; 496 | 9FBE110817FF00FA007C983B /* Release */ = { 497 | isa = XCBuildConfiguration; 498 | baseConfigurationReference = E0BAA7131DBC4E8ABDED1B58 /* Pods.xcconfig */; 499 | buildSettings = { 500 | ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; 501 | FRAMEWORK_SEARCH_PATHS = ( 502 | "$(SDKROOT)/Developer/Library/Frameworks", 503 | "$(inherited)", 504 | "$(DEVELOPER_FRAMEWORKS_DIR)", 505 | ); 506 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 507 | GCC_PREFIX_HEADER = "Abra/Abra-Prefix.pch"; 508 | INFOPLIST_FILE = "AbraTests/AbraTests-Info.plist"; 509 | PRODUCT_NAME = "$(TARGET_NAME)"; 510 | WRAPPER_EXTENSION = xctest; 511 | }; 512 | name = Release; 513 | }; 514 | /* End XCBuildConfiguration section */ 515 | 516 | /* Begin XCConfigurationList section */ 517 | 9FBE10DB17FF00FA007C983B /* Build configuration list for PBXProject "Abra" */ = { 518 | isa = XCConfigurationList; 519 | buildConfigurations = ( 520 | 9FBE110117FF00FA007C983B /* Debug */, 521 | 9FBE110217FF00FA007C983B /* Release */, 522 | ); 523 | defaultConfigurationIsVisible = 0; 524 | defaultConfigurationName = Release; 525 | }; 526 | 9FBE110317FF00FA007C983B /* Build configuration list for PBXNativeTarget "Abra" */ = { 527 | isa = XCConfigurationList; 528 | buildConfigurations = ( 529 | 9FBE110417FF00FA007C983B /* Debug */, 530 | 9FBE110517FF00FA007C983B /* Release */, 531 | ); 532 | defaultConfigurationIsVisible = 0; 533 | defaultConfigurationName = Release; 534 | }; 535 | 9FBE110617FF00FA007C983B /* Build configuration list for PBXNativeTarget "AbraTests" */ = { 536 | isa = XCConfigurationList; 537 | buildConfigurations = ( 538 | 9FBE110717FF00FA007C983B /* Debug */, 539 | 9FBE110817FF00FA007C983B /* Release */, 540 | ); 541 | defaultConfigurationIsVisible = 0; 542 | defaultConfigurationName = Release; 543 | }; 544 | /* End XCConfigurationList section */ 545 | }; 546 | rootObject = 9FBE10D817FF00FA007C983B /* Project object */; 547 | } 548 | -------------------------------------------------------------------------------- /Example/AbraExample/AbraExample.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | archiveVersion 6 | 1 7 | classes 8 | 9 | objectVersion 10 | 46 11 | objects 12 | 13 | 41D37271098640668DE69D57 14 | 15 | includeInIndex 16 | 1 17 | isa 18 | PBXFileReference 19 | lastKnownFileType 20 | text.xcconfig 21 | name 22 | Pods.xcconfig 23 | path 24 | Pods/Pods.xcconfig 25 | sourceTree 26 | <group> 27 | 28 | 571AB8C0B55F4344B092D9AC 29 | 30 | fileRef 31 | DF3598E1B33948A798625761 32 | isa 33 | PBXBuildFile 34 | 35 | 6C2AE4C6844942C782D3A876 36 | 37 | buildActionMask 38 | 2147483647 39 | files 40 | 41 | inputPaths 42 | 43 | isa 44 | PBXShellScriptBuildPhase 45 | name 46 | Check Pods Manifest.lock 47 | outputPaths 48 | 49 | runOnlyForDeploymentPostprocessing 50 | 0 51 | shellPath 52 | /bin/sh 53 | shellScript 54 | diff "${PODS_ROOT}/../Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null 55 | if [[ $? != 0 ]] ; then 56 | cat << EOM 57 | error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation. 58 | EOM 59 | exit 1 60 | fi 61 | 62 | showEnvVarsInLog 63 | 0 64 | 65 | 9FBE110917FF020D007C983B 66 | 67 | children 68 | 69 | 9FBE111B17FF020D007C983B 70 | 9FBE113A17FF020D007C983B 71 | 9FBE111417FF020D007C983B 72 | 9FBE111317FF020D007C983B 73 | 41D37271098640668DE69D57 74 | 75 | isa 76 | PBXGroup 77 | sourceTree 78 | <group> 79 | 80 | 9FBE110A17FF020D007C983B 81 | 82 | attributes 83 | 84 | CLASSPREFIX 85 | AB 86 | LastUpgradeCheck 87 | 0500 88 | ORGANIZATIONNAME 89 | Thomas Ricouard 90 | TargetAttributes 91 | 92 | 9FBE113217FF020D007C983B 93 | 94 | TestTargetID 95 | 9FBE111117FF020D007C983B 96 | 97 | 98 | 99 | buildConfigurationList 100 | 9FBE110D17FF020D007C983B 101 | compatibilityVersion 102 | Xcode 3.2 103 | developmentRegion 104 | English 105 | hasScannedForEncodings 106 | 0 107 | isa 108 | PBXProject 109 | knownRegions 110 | 111 | en 112 | Base 113 | 114 | mainGroup 115 | 9FBE110917FF020D007C983B 116 | productRefGroup 117 | 9FBE111317FF020D007C983B 118 | projectDirPath 119 | 120 | projectReferences 121 | 122 | projectRoot 123 | 124 | targets 125 | 126 | 9FBE111117FF020D007C983B 127 | 9FBE113217FF020D007C983B 128 | 129 | 130 | 9FBE110D17FF020D007C983B 131 | 132 | buildConfigurations 133 | 134 | 9FBE114217FF020D007C983B 135 | 9FBE114317FF020D007C983B 136 | 137 | defaultConfigurationIsVisible 138 | 0 139 | defaultConfigurationName 140 | Release 141 | isa 142 | XCConfigurationList 143 | 144 | 9FBE110E17FF020D007C983B 145 | 146 | buildActionMask 147 | 2147483647 148 | files 149 | 150 | 9FBE112217FF020D007C983B 151 | 9FBE112C17FF020D007C983B 152 | 9FBE112617FF020D007C983B 153 | 154 | isa 155 | PBXSourcesBuildPhase 156 | runOnlyForDeploymentPostprocessing 157 | 0 158 | 159 | 9FBE110F17FF020D007C983B 160 | 161 | buildActionMask 162 | 2147483647 163 | files 164 | 165 | 9FBE111817FF020D007C983B 166 | 9FBE111A17FF020D007C983B 167 | 9FBE111617FF020D007C983B 168 | 571AB8C0B55F4344B092D9AC 169 | 170 | isa 171 | PBXFrameworksBuildPhase 172 | runOnlyForDeploymentPostprocessing 173 | 0 174 | 175 | 9FBE111017FF020D007C983B 176 | 177 | buildActionMask 178 | 2147483647 179 | files 180 | 181 | 9FBE112E17FF020D007C983B 182 | 9FBE112017FF020D007C983B 183 | 9FBE112917FF020D007C983B 184 | 185 | isa 186 | PBXResourcesBuildPhase 187 | runOnlyForDeploymentPostprocessing 188 | 0 189 | 190 | 9FBE111117FF020D007C983B 191 | 192 | buildConfigurationList 193 | 9FBE114417FF020D007C983B 194 | buildPhases 195 | 196 | 6C2AE4C6844942C782D3A876 197 | 9FBE110E17FF020D007C983B 198 | 9FBE110F17FF020D007C983B 199 | 9FBE111017FF020D007C983B 200 | B7AF10194786496EAE886759 201 | 202 | buildRules 203 | 204 | dependencies 205 | 206 | isa 207 | PBXNativeTarget 208 | name 209 | AbraExample 210 | productName 211 | AbraExample 212 | productReference 213 | 9FBE111217FF020D007C983B 214 | productType 215 | com.apple.product-type.application 216 | 217 | 9FBE111217FF020D007C983B 218 | 219 | explicitFileType 220 | wrapper.application 221 | includeInIndex 222 | 0 223 | isa 224 | PBXFileReference 225 | path 226 | AbraExample.app 227 | sourceTree 228 | BUILT_PRODUCTS_DIR 229 | 230 | 9FBE111317FF020D007C983B 231 | 232 | children 233 | 234 | 9FBE111217FF020D007C983B 235 | 9FBE113317FF020D007C983B 236 | 237 | isa 238 | PBXGroup 239 | name 240 | Products 241 | sourceTree 242 | <group> 243 | 244 | 9FBE111417FF020D007C983B 245 | 246 | children 247 | 248 | 9FBE111517FF020D007C983B 249 | 9FBE111717FF020D007C983B 250 | 9FBE111917FF020D007C983B 251 | 9FBE113417FF020D007C983B 252 | DF3598E1B33948A798625761 253 | 254 | isa 255 | PBXGroup 256 | name 257 | Frameworks 258 | sourceTree 259 | <group> 260 | 261 | 9FBE111517FF020D007C983B 262 | 263 | isa 264 | PBXFileReference 265 | lastKnownFileType 266 | wrapper.framework 267 | name 268 | Foundation.framework 269 | path 270 | System/Library/Frameworks/Foundation.framework 271 | sourceTree 272 | SDKROOT 273 | 274 | 9FBE111617FF020D007C983B 275 | 276 | fileRef 277 | 9FBE111517FF020D007C983B 278 | isa 279 | PBXBuildFile 280 | 281 | 9FBE111717FF020D007C983B 282 | 283 | isa 284 | PBXFileReference 285 | lastKnownFileType 286 | wrapper.framework 287 | name 288 | CoreGraphics.framework 289 | path 290 | System/Library/Frameworks/CoreGraphics.framework 291 | sourceTree 292 | SDKROOT 293 | 294 | 9FBE111817FF020D007C983B 295 | 296 | fileRef 297 | 9FBE111717FF020D007C983B 298 | isa 299 | PBXBuildFile 300 | 301 | 9FBE111917FF020D007C983B 302 | 303 | isa 304 | PBXFileReference 305 | lastKnownFileType 306 | wrapper.framework 307 | name 308 | UIKit.framework 309 | path 310 | System/Library/Frameworks/UIKit.framework 311 | sourceTree 312 | SDKROOT 313 | 314 | 9FBE111A17FF020D007C983B 315 | 316 | fileRef 317 | 9FBE111917FF020D007C983B 318 | isa 319 | PBXBuildFile 320 | 321 | 9FBE111B17FF020D007C983B 322 | 323 | children 324 | 325 | 9FBE112417FF020D007C983B 326 | 9FBE112517FF020D007C983B 327 | 9FBE112717FF020D007C983B 328 | 9FBE112A17FF020D007C983B 329 | 9FBE112B17FF020D007C983B 330 | 9FBE112D17FF020D007C983B 331 | 9FBE111C17FF020D007C983B 332 | 333 | isa 334 | PBXGroup 335 | path 336 | AbraExample 337 | sourceTree 338 | <group> 339 | 340 | 9FBE111C17FF020D007C983B 341 | 342 | children 343 | 344 | 9FBE111D17FF020D007C983B 345 | 9FBE111E17FF020D007C983B 346 | 9FBE112117FF020D007C983B 347 | 9FBE112317FF020D007C983B 348 | 349 | isa 350 | PBXGroup 351 | name 352 | Supporting Files 353 | sourceTree 354 | <group> 355 | 356 | 9FBE111D17FF020D007C983B 357 | 358 | isa 359 | PBXFileReference 360 | lastKnownFileType 361 | text.plist.xml 362 | path 363 | AbraExample-Info.plist 364 | sourceTree 365 | <group> 366 | 367 | 9FBE111E17FF020D007C983B 368 | 369 | children 370 | 371 | 9FBE111F17FF020D007C983B 372 | 373 | isa 374 | PBXVariantGroup 375 | name 376 | InfoPlist.strings 377 | sourceTree 378 | <group> 379 | 380 | 9FBE111F17FF020D007C983B 381 | 382 | isa 383 | PBXFileReference 384 | lastKnownFileType 385 | text.plist.strings 386 | name 387 | en 388 | path 389 | en.lproj/InfoPlist.strings 390 | sourceTree 391 | <group> 392 | 393 | 9FBE112017FF020D007C983B 394 | 395 | fileRef 396 | 9FBE111E17FF020D007C983B 397 | isa 398 | PBXBuildFile 399 | 400 | 9FBE112117FF020D007C983B 401 | 402 | isa 403 | PBXFileReference 404 | lastKnownFileType 405 | sourcecode.c.objc 406 | path 407 | main.m 408 | sourceTree 409 | <group> 410 | 411 | 9FBE112217FF020D007C983B 412 | 413 | fileRef 414 | 9FBE112117FF020D007C983B 415 | isa 416 | PBXBuildFile 417 | 418 | 9FBE112317FF020D007C983B 419 | 420 | isa 421 | PBXFileReference 422 | lastKnownFileType 423 | sourcecode.c.h 424 | path 425 | AbraExample-Prefix.pch 426 | sourceTree 427 | <group> 428 | 429 | 9FBE112417FF020D007C983B 430 | 431 | isa 432 | PBXFileReference 433 | lastKnownFileType 434 | sourcecode.c.h 435 | path 436 | ABAppDelegate.h 437 | sourceTree 438 | <group> 439 | 440 | 9FBE112517FF020D007C983B 441 | 442 | isa 443 | PBXFileReference 444 | lastKnownFileType 445 | sourcecode.c.objc 446 | path 447 | ABAppDelegate.m 448 | sourceTree 449 | <group> 450 | 451 | 9FBE112617FF020D007C983B 452 | 453 | fileRef 454 | 9FBE112517FF020D007C983B 455 | isa 456 | PBXBuildFile 457 | 458 | 9FBE112717FF020D007C983B 459 | 460 | children 461 | 462 | 9FBE112817FF020D007C983B 463 | 464 | isa 465 | PBXVariantGroup 466 | name 467 | Main.storyboard 468 | sourceTree 469 | <group> 470 | 471 | 9FBE112817FF020D007C983B 472 | 473 | isa 474 | PBXFileReference 475 | lastKnownFileType 476 | file.storyboard 477 | name 478 | Base 479 | path 480 | Base.lproj/Main.storyboard 481 | sourceTree 482 | <group> 483 | 484 | 9FBE112917FF020D007C983B 485 | 486 | fileRef 487 | 9FBE112717FF020D007C983B 488 | isa 489 | PBXBuildFile 490 | 491 | 9FBE112A17FF020D007C983B 492 | 493 | isa 494 | PBXFileReference 495 | lastKnownFileType 496 | sourcecode.c.h 497 | path 498 | ABViewController.h 499 | sourceTree 500 | <group> 501 | 502 | 9FBE112B17FF020D007C983B 503 | 504 | isa 505 | PBXFileReference 506 | lastKnownFileType 507 | sourcecode.c.objc 508 | path 509 | ABViewController.m 510 | sourceTree 511 | <group> 512 | 513 | 9FBE112C17FF020D007C983B 514 | 515 | fileRef 516 | 9FBE112B17FF020D007C983B 517 | isa 518 | PBXBuildFile 519 | 520 | 9FBE112D17FF020D007C983B 521 | 522 | isa 523 | PBXFileReference 524 | lastKnownFileType 525 | folder.assetcatalog 526 | path 527 | Images.xcassets 528 | sourceTree 529 | <group> 530 | 531 | 9FBE112E17FF020D007C983B 532 | 533 | fileRef 534 | 9FBE112D17FF020D007C983B 535 | isa 536 | PBXBuildFile 537 | 538 | 9FBE112F17FF020D007C983B 539 | 540 | buildActionMask 541 | 2147483647 542 | files 543 | 544 | 9FBE114117FF020D007C983B 545 | 546 | isa 547 | PBXSourcesBuildPhase 548 | runOnlyForDeploymentPostprocessing 549 | 0 550 | 551 | 9FBE113017FF020D007C983B 552 | 553 | buildActionMask 554 | 2147483647 555 | files 556 | 557 | 9FBE113517FF020D007C983B 558 | 9FBE113717FF020D007C983B 559 | 9FBE113617FF020D007C983B 560 | 561 | isa 562 | PBXFrameworksBuildPhase 563 | runOnlyForDeploymentPostprocessing 564 | 0 565 | 566 | 9FBE113117FF020D007C983B 567 | 568 | buildActionMask 569 | 2147483647 570 | files 571 | 572 | 9FBE113F17FF020D007C983B 573 | 574 | isa 575 | PBXResourcesBuildPhase 576 | runOnlyForDeploymentPostprocessing 577 | 0 578 | 579 | 9FBE113217FF020D007C983B 580 | 581 | buildConfigurationList 582 | 9FBE114717FF020D007C983B 583 | buildPhases 584 | 585 | 9FBE112F17FF020D007C983B 586 | 9FBE113017FF020D007C983B 587 | 9FBE113117FF020D007C983B 588 | 589 | buildRules 590 | 591 | dependencies 592 | 593 | 9FBE113917FF020D007C983B 594 | 595 | isa 596 | PBXNativeTarget 597 | name 598 | AbraExampleTests 599 | productName 600 | AbraExampleTests 601 | productReference 602 | 9FBE113317FF020D007C983B 603 | productType 604 | com.apple.product-type.bundle.unit-test 605 | 606 | 9FBE113317FF020D007C983B 607 | 608 | explicitFileType 609 | wrapper.cfbundle 610 | includeInIndex 611 | 0 612 | isa 613 | PBXFileReference 614 | path 615 | AbraExampleTests.xctest 616 | sourceTree 617 | BUILT_PRODUCTS_DIR 618 | 619 | 9FBE113417FF020D007C983B 620 | 621 | isa 622 | PBXFileReference 623 | lastKnownFileType 624 | wrapper.framework 625 | name 626 | XCTest.framework 627 | path 628 | Library/Frameworks/XCTest.framework 629 | sourceTree 630 | DEVELOPER_DIR 631 | 632 | 9FBE113517FF020D007C983B 633 | 634 | fileRef 635 | 9FBE113417FF020D007C983B 636 | isa 637 | PBXBuildFile 638 | 639 | 9FBE113617FF020D007C983B 640 | 641 | fileRef 642 | 9FBE111517FF020D007C983B 643 | isa 644 | PBXBuildFile 645 | 646 | 9FBE113717FF020D007C983B 647 | 648 | fileRef 649 | 9FBE111917FF020D007C983B 650 | isa 651 | PBXBuildFile 652 | 653 | 9FBE113817FF020D007C983B 654 | 655 | containerPortal 656 | 9FBE110A17FF020D007C983B 657 | isa 658 | PBXContainerItemProxy 659 | proxyType 660 | 1 661 | remoteGlobalIDString 662 | 9FBE111117FF020D007C983B 663 | remoteInfo 664 | AbraExample 665 | 666 | 9FBE113917FF020D007C983B 667 | 668 | isa 669 | PBXTargetDependency 670 | target 671 | 9FBE111117FF020D007C983B 672 | targetProxy 673 | 9FBE113817FF020D007C983B 674 | 675 | 9FBE113A17FF020D007C983B 676 | 677 | children 678 | 679 | 9FBE114017FF020D007C983B 680 | 9FBE113B17FF020D007C983B 681 | 682 | isa 683 | PBXGroup 684 | path 685 | AbraExampleTests 686 | sourceTree 687 | <group> 688 | 689 | 9FBE113B17FF020D007C983B 690 | 691 | children 692 | 693 | 9FBE113C17FF020D007C983B 694 | 9FBE113D17FF020D007C983B 695 | 696 | isa 697 | PBXGroup 698 | name 699 | Supporting Files 700 | sourceTree 701 | <group> 702 | 703 | 9FBE113C17FF020D007C983B 704 | 705 | isa 706 | PBXFileReference 707 | lastKnownFileType 708 | text.plist.xml 709 | path 710 | AbraExampleTests-Info.plist 711 | sourceTree 712 | <group> 713 | 714 | 9FBE113D17FF020D007C983B 715 | 716 | children 717 | 718 | 9FBE113E17FF020D007C983B 719 | 720 | isa 721 | PBXVariantGroup 722 | name 723 | InfoPlist.strings 724 | sourceTree 725 | <group> 726 | 727 | 9FBE113E17FF020D007C983B 728 | 729 | isa 730 | PBXFileReference 731 | lastKnownFileType 732 | text.plist.strings 733 | name 734 | en 735 | path 736 | en.lproj/InfoPlist.strings 737 | sourceTree 738 | <group> 739 | 740 | 9FBE113F17FF020D007C983B 741 | 742 | fileRef 743 | 9FBE113D17FF020D007C983B 744 | isa 745 | PBXBuildFile 746 | 747 | 9FBE114017FF020D007C983B 748 | 749 | isa 750 | PBXFileReference 751 | lastKnownFileType 752 | sourcecode.c.objc 753 | path 754 | AbraExampleTests.m 755 | sourceTree 756 | <group> 757 | 758 | 9FBE114117FF020D007C983B 759 | 760 | fileRef 761 | 9FBE114017FF020D007C983B 762 | isa 763 | PBXBuildFile 764 | 765 | 9FBE114217FF020D007C983B 766 | 767 | buildSettings 768 | 769 | ALWAYS_SEARCH_USER_PATHS 770 | NO 771 | ARCHS 772 | $(ARCHS_STANDARD_INCLUDING_64_BIT) 773 | CLANG_CXX_LANGUAGE_STANDARD 774 | gnu++0x 775 | CLANG_CXX_LIBRARY 776 | libc++ 777 | CLANG_ENABLE_MODULES 778 | YES 779 | CLANG_ENABLE_OBJC_ARC 780 | YES 781 | CLANG_WARN_BOOL_CONVERSION 782 | YES 783 | CLANG_WARN_CONSTANT_CONVERSION 784 | YES 785 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE 786 | YES_ERROR 787 | CLANG_WARN_EMPTY_BODY 788 | YES 789 | CLANG_WARN_ENUM_CONVERSION 790 | YES 791 | CLANG_WARN_INT_CONVERSION 792 | YES 793 | CLANG_WARN_OBJC_ROOT_CLASS 794 | YES_ERROR 795 | CLANG_WARN__DUPLICATE_METHOD_MATCH 796 | YES 797 | CODE_SIGN_IDENTITY[sdk=iphoneos*] 798 | iPhone Developer 799 | COPY_PHASE_STRIP 800 | NO 801 | GCC_C_LANGUAGE_STANDARD 802 | gnu99 803 | GCC_DYNAMIC_NO_PIC 804 | NO 805 | GCC_OPTIMIZATION_LEVEL 806 | 0 807 | GCC_PREPROCESSOR_DEFINITIONS 808 | 809 | DEBUG=1 810 | $(inherited) 811 | 812 | GCC_SYMBOLS_PRIVATE_EXTERN 813 | NO 814 | GCC_WARN_64_TO_32_BIT_CONVERSION 815 | YES 816 | GCC_WARN_ABOUT_RETURN_TYPE 817 | YES_ERROR 818 | GCC_WARN_UNDECLARED_SELECTOR 819 | YES 820 | GCC_WARN_UNINITIALIZED_AUTOS 821 | YES 822 | GCC_WARN_UNUSED_FUNCTION 823 | YES 824 | GCC_WARN_UNUSED_VARIABLE 825 | YES 826 | IPHONEOS_DEPLOYMENT_TARGET 827 | 7.0 828 | ONLY_ACTIVE_ARCH 829 | YES 830 | SDKROOT 831 | iphoneos 832 | 833 | isa 834 | XCBuildConfiguration 835 | name 836 | Debug 837 | 838 | 9FBE114317FF020D007C983B 839 | 840 | buildSettings 841 | 842 | ALWAYS_SEARCH_USER_PATHS 843 | NO 844 | ARCHS 845 | $(ARCHS_STANDARD_INCLUDING_64_BIT) 846 | CLANG_CXX_LANGUAGE_STANDARD 847 | gnu++0x 848 | CLANG_CXX_LIBRARY 849 | libc++ 850 | CLANG_ENABLE_MODULES 851 | YES 852 | CLANG_ENABLE_OBJC_ARC 853 | YES 854 | CLANG_WARN_BOOL_CONVERSION 855 | YES 856 | CLANG_WARN_CONSTANT_CONVERSION 857 | YES 858 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE 859 | YES_ERROR 860 | CLANG_WARN_EMPTY_BODY 861 | YES 862 | CLANG_WARN_ENUM_CONVERSION 863 | YES 864 | CLANG_WARN_INT_CONVERSION 865 | YES 866 | CLANG_WARN_OBJC_ROOT_CLASS 867 | YES_ERROR 868 | CLANG_WARN__DUPLICATE_METHOD_MATCH 869 | YES 870 | CODE_SIGN_IDENTITY[sdk=iphoneos*] 871 | iPhone Developer 872 | COPY_PHASE_STRIP 873 | YES 874 | ENABLE_NS_ASSERTIONS 875 | NO 876 | GCC_C_LANGUAGE_STANDARD 877 | gnu99 878 | GCC_WARN_64_TO_32_BIT_CONVERSION 879 | YES 880 | GCC_WARN_ABOUT_RETURN_TYPE 881 | YES_ERROR 882 | GCC_WARN_UNDECLARED_SELECTOR 883 | YES 884 | GCC_WARN_UNINITIALIZED_AUTOS 885 | YES 886 | GCC_WARN_UNUSED_FUNCTION 887 | YES 888 | GCC_WARN_UNUSED_VARIABLE 889 | YES 890 | IPHONEOS_DEPLOYMENT_TARGET 891 | 7.0 892 | SDKROOT 893 | iphoneos 894 | VALIDATE_PRODUCT 895 | YES 896 | 897 | isa 898 | XCBuildConfiguration 899 | name 900 | Release 901 | 902 | 9FBE114417FF020D007C983B 903 | 904 | buildConfigurations 905 | 906 | 9FBE114517FF020D007C983B 907 | 9FBE114617FF020D007C983B 908 | 909 | defaultConfigurationIsVisible 910 | 0 911 | isa 912 | XCConfigurationList 913 | 914 | 9FBE114517FF020D007C983B 915 | 916 | baseConfigurationReference 917 | 41D37271098640668DE69D57 918 | buildSettings 919 | 920 | ASSETCATALOG_COMPILER_APPICON_NAME 921 | AppIcon 922 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME 923 | LaunchImage 924 | GCC_PRECOMPILE_PREFIX_HEADER 925 | YES 926 | GCC_PREFIX_HEADER 927 | AbraExample/AbraExample-Prefix.pch 928 | INFOPLIST_FILE 929 | AbraExample/AbraExample-Info.plist 930 | PRODUCT_NAME 931 | $(TARGET_NAME) 932 | WRAPPER_EXTENSION 933 | app 934 | 935 | isa 936 | XCBuildConfiguration 937 | name 938 | Debug 939 | 940 | 9FBE114617FF020D007C983B 941 | 942 | baseConfigurationReference 943 | 41D37271098640668DE69D57 944 | buildSettings 945 | 946 | ASSETCATALOG_COMPILER_APPICON_NAME 947 | AppIcon 948 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME 949 | LaunchImage 950 | GCC_PRECOMPILE_PREFIX_HEADER 951 | YES 952 | GCC_PREFIX_HEADER 953 | AbraExample/AbraExample-Prefix.pch 954 | INFOPLIST_FILE 955 | AbraExample/AbraExample-Info.plist 956 | PRODUCT_NAME 957 | $(TARGET_NAME) 958 | WRAPPER_EXTENSION 959 | app 960 | 961 | isa 962 | XCBuildConfiguration 963 | name 964 | Release 965 | 966 | 9FBE114717FF020D007C983B 967 | 968 | buildConfigurations 969 | 970 | 9FBE114817FF020D007C983B 971 | 9FBE114917FF020D007C983B 972 | 973 | defaultConfigurationIsVisible 974 | 0 975 | isa 976 | XCConfigurationList 977 | 978 | 9FBE114817FF020D007C983B 979 | 980 | buildSettings 981 | 982 | ARCHS 983 | $(ARCHS_STANDARD_INCLUDING_64_BIT) 984 | BUNDLE_LOADER 985 | $(BUILT_PRODUCTS_DIR)/AbraExample.app/AbraExample 986 | FRAMEWORK_SEARCH_PATHS 987 | 988 | $(SDKROOT)/Developer/Library/Frameworks 989 | $(inherited) 990 | $(DEVELOPER_FRAMEWORKS_DIR) 991 | 992 | GCC_PRECOMPILE_PREFIX_HEADER 993 | YES 994 | GCC_PREFIX_HEADER 995 | AbraExample/AbraExample-Prefix.pch 996 | GCC_PREPROCESSOR_DEFINITIONS 997 | 998 | DEBUG=1 999 | $(inherited) 1000 | 1001 | INFOPLIST_FILE 1002 | AbraExampleTests/AbraExampleTests-Info.plist 1003 | PRODUCT_NAME 1004 | $(TARGET_NAME) 1005 | TEST_HOST 1006 | $(BUNDLE_LOADER) 1007 | WRAPPER_EXTENSION 1008 | xctest 1009 | 1010 | isa 1011 | XCBuildConfiguration 1012 | name 1013 | Debug 1014 | 1015 | 9FBE114917FF020D007C983B 1016 | 1017 | buildSettings 1018 | 1019 | ARCHS 1020 | $(ARCHS_STANDARD_INCLUDING_64_BIT) 1021 | BUNDLE_LOADER 1022 | $(BUILT_PRODUCTS_DIR)/AbraExample.app/AbraExample 1023 | FRAMEWORK_SEARCH_PATHS 1024 | 1025 | $(SDKROOT)/Developer/Library/Frameworks 1026 | $(inherited) 1027 | $(DEVELOPER_FRAMEWORKS_DIR) 1028 | 1029 | GCC_PRECOMPILE_PREFIX_HEADER 1030 | YES 1031 | GCC_PREFIX_HEADER 1032 | AbraExample/AbraExample-Prefix.pch 1033 | INFOPLIST_FILE 1034 | AbraExampleTests/AbraExampleTests-Info.plist 1035 | PRODUCT_NAME 1036 | $(TARGET_NAME) 1037 | TEST_HOST 1038 | $(BUNDLE_LOADER) 1039 | WRAPPER_EXTENSION 1040 | xctest 1041 | 1042 | isa 1043 | XCBuildConfiguration 1044 | name 1045 | Release 1046 | 1047 | B7AF10194786496EAE886759 1048 | 1049 | buildActionMask 1050 | 2147483647 1051 | files 1052 | 1053 | inputPaths 1054 | 1055 | isa 1056 | PBXShellScriptBuildPhase 1057 | name 1058 | Copy Pods Resources 1059 | outputPaths 1060 | 1061 | runOnlyForDeploymentPostprocessing 1062 | 0 1063 | shellPath 1064 | /bin/sh 1065 | shellScript 1066 | "${SRCROOT}/Pods/Pods-resources.sh" 1067 | 1068 | showEnvVarsInLog 1069 | 0 1070 | 1071 | DF3598E1B33948A798625761 1072 | 1073 | explicitFileType 1074 | archive.ar 1075 | includeInIndex 1076 | 0 1077 | isa 1078 | PBXFileReference 1079 | path 1080 | libPods.a 1081 | sourceTree 1082 | BUILT_PRODUCTS_DIR 1083 | 1084 | 1085 | rootObject 1086 | 9FBE110A17FF020D007C983B 1087 | 1088 | 1089 | --------------------------------------------------------------------------------