From fad171373ea74afe47a2d3ed2b467c342618f177 Mon Sep 17 00:00:00 2001 From: Giuseppe Nucifora Date: Wed, 27 Jan 2016 15:14:04 +0100 Subject: [PATCH] - Refactoring classes - Add Installation Class - Add AccessToken Class (not yet complete) - Remove PNObjectProperty - Move PNObjectProperty methods to "PNObject+Protected.h" --- Example/Pods/Pods.xcodeproj/project.pbxproj | 92 ++-- PNObject.podspec | 2 +- Pod/Classes/PNClasses/PNAccessToken.h | 30 ++ Pod/Classes/PNClasses/PNAccessToken.m | 44 ++ Pod/Classes/PNClasses/PNAddress.h | 51 ++ Pod/Classes/{User => PNClasses}/PNAddress.m | 0 Pod/Classes/PNClasses/PNInstallation.h | 59 +++ Pod/Classes/PNClasses/PNInstallation.m | 111 +++++ Pod/Classes/{User => PNClasses}/PNLocation.h | 10 + Pod/Classes/{User => PNClasses}/PNLocation.m | 0 Pod/Classes/PNClasses/PNUser.h | 103 ++++ Pod/Classes/PNClasses/PNUser.m | 156 +++++++ Pod/Classes/PNObject+Protected.h | 59 ++- Pod/Classes/PNObject+Protected.m | 296 +++++++----- Pod/Classes/PNObject.h | 23 +- Pod/Classes/PNObject.m | 465 ++++++++++--------- Pod/Classes/PNObjectConfig.h | 38 +- Pod/Classes/PNObjectModel.h | 22 +- Pod/Classes/PNObjectModel.m | 413 ++++++++-------- Pod/Classes/PNObjectProperty.h | 16 - Pod/Classes/PNObjectProperty.m | 84 ---- Pod/Classes/User/PNAddress.h | 23 - Pod/Classes/User/PNUser.h | 45 -- Pod/Classes/User/PNUser.m | 161 ------- 24 files changed, 1358 insertions(+), 945 deletions(-) create mode 100644 Pod/Classes/PNClasses/PNAccessToken.h create mode 100644 Pod/Classes/PNClasses/PNAccessToken.m create mode 100644 Pod/Classes/PNClasses/PNAddress.h rename Pod/Classes/{User => PNClasses}/PNAddress.m (100%) create mode 100644 Pod/Classes/PNClasses/PNInstallation.h create mode 100644 Pod/Classes/PNClasses/PNInstallation.m rename Pod/Classes/{User => PNClasses}/PNLocation.h (57%) rename Pod/Classes/{User => PNClasses}/PNLocation.m (100%) create mode 100644 Pod/Classes/PNClasses/PNUser.h create mode 100644 Pod/Classes/PNClasses/PNUser.m delete mode 100755 Pod/Classes/PNObjectProperty.h delete mode 100755 Pod/Classes/PNObjectProperty.m delete mode 100644 Pod/Classes/User/PNAddress.h delete mode 100644 Pod/Classes/User/PNUser.h delete mode 100644 Pod/Classes/User/PNUser.m diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index e069fe5..a56a17f 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -13,18 +13,16 @@ 02F3342DE8A2496B117A12DD376E0C6B /* CodFis+Helper.h in Headers */ = {isa = PBXBuildFile; fileRef = 6F47C9BB792D2EA70717C10B30D32E7F /* CodFis+Helper.h */; settings = {ATTRIBUTES = (Public, ); }; }; 05BAC8389F831D30EAD8A202A8021558 /* UIDevice-Utils-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 615612B94211EC29E800BCAA0619EE7D /* UIDevice-Utils-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 06CDD49E8FC6C70C6B5E7D2AB488ADDB /* PNObject+Protected.m in Sources */ = {isa = PBXBuildFile; fileRef = 39D7190F4033EDFE21FB84273770F5BD /* PNObject+Protected.m */; }; - 07A88B9F8DA0FCF2BEECDDDAF81F5784 /* PNObject+Protected.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A4906471B1AA70EF38FB266AD032C53 /* PNObject+Protected.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 07A88B9F8DA0FCF2BEECDDDAF81F5784 /* PNObject+Protected.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A4906471B1AA70EF38FB266AD032C53 /* PNObject+Protected.h */; }; 07CAFACAFAC87ABBF28D453E70832464 /* UIImage+Compare.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A42D327C01AB49661866A8872FF648A /* UIImage+Compare.m */; }; 0A5DFD94EE83E385C1C7D24986E04592 /* SwiftSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5B548B14F622BEC36AD8C4BED38D0A01 /* SwiftSupport.swift */; }; 0BF2FABBA49CF4F2005A7A97B1B130A0 /* Pods-PNObject_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A838922082CBB903238CF0302A9F06FC /* Pods-PNObject_Tests-dummy.m */; }; 0C6FF91EB1F0391ED75DC72D31D159EF /* EXPMatchers+beTruthy.m in Sources */ = {isa = PBXBuildFile; fileRef = D711F932EF0B66455153299015509775 /* EXPMatchers+beTruthy.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - 0CF0A5CCA7F6B01D347DDC64E3005133 /* PNObjectProperty.h in Headers */ = {isa = PBXBuildFile; fileRef = 222A85499B021E976CA2C6E97354362D /* PNObjectProperty.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0D16B556212D317A0D4FEB71E102E207 /* EXPMatchers+beLessThan.h in Headers */ = {isa = PBXBuildFile; fileRef = 24861D9EDF6A0490D414329EE5A19852 /* EXPMatchers+beLessThan.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0E0A7646BF9FF99BDC58A4F489371C1A /* XCTestCase+Specta.h in Headers */ = {isa = PBXBuildFile; fileRef = FD87E502528B1E97C23197AD57D63929 /* XCTestCase+Specta.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0EBFA5FBE4953A83B677CE2A75746761 /* EXPMatchers+beLessThan.m in Sources */ = {isa = PBXBuildFile; fileRef = EE91442CC73115E1380DDB8305D341E2 /* EXPMatchers+beLessThan.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 0F94F5B0ABB3252B9275B7C129EC7A26 /* EXPMatchers+equal.h in Headers */ = {isa = PBXBuildFile; fileRef = 9EF87FF359BC3AD8BE9D4DE42B67F53A /* EXPMatchers+equal.h */; settings = {ATTRIBUTES = (Public, ); }; }; 11C1AEB289C1EB80089349B71F09D04B /* EXPMatchers+raiseWithReason.h in Headers */ = {isa = PBXBuildFile; fileRef = DD06EF53B6704D238FE17DAE6A3B18BE /* EXPMatchers+raiseWithReason.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 11D8963BA2226E54AE47D011AF9221AA /* PNObjectProperty.m in Sources */ = {isa = PBXBuildFile; fileRef = D64E5FBEECD5F45817771685FE53E7CC /* PNObjectProperty.m */; }; 128D2C9C4118D24BECB4F2CA00BE2E21 /* UIDevice-Hardware.h in Headers */ = {isa = PBXBuildFile; fileRef = 33311BF46EEB0F31BC87ABCABE7CAFAD /* UIDevice-Hardware.h */; settings = {ATTRIBUTES = (Public, ); }; }; 12C66CB4A6AA6270B71012F77C9206FC /* NSString-Helper.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 9613E58926B59601B3895874354AFF97 /* NSString-Helper.bundle */; }; 1312A7D381C51428CF481E33E3D37901 /* EXPMatchers+beGreaterThan.m in Sources */ = {isa = PBXBuildFile; fileRef = F17D7E14EA40B1C6F4951EBB5FDF7BAB /* EXPMatchers+beGreaterThan.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; @@ -49,7 +47,6 @@ 20C0CFB6F8C29123D1667E2676D8B2F5 /* FBSnapshotTestCase.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BCB0829DA9537740F25B963B5813EE9 /* FBSnapshotTestCase.h */; settings = {ATTRIBUTES = (Public, ); }; }; 20EE8030FCF2402DAC7F1C9B9DDAEF79 /* AFURLRequestSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = F70FDBBAA8A2DBAC7FA08F509B680C29 /* AFURLRequestSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; 21F2FA42D9B52C283FA6F0BC4FD5C64F /* Specta-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 814694BFDA309FA54BF6774D2E4861BB /* Specta-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2397A06DC7FB975B63932706F7DF0BC8 /* PNAddress.m in Sources */ = {isa = PBXBuildFile; fileRef = 554AFB0F246CEC2AD06F032D0860EED8 /* PNAddress.m */; }; 2549CD1370AF63009DEC76693F5E9BD1 /* FBSnapshotTestCase.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CA822B4C4A4F2E1BA28DDDC4EF21A29B /* FBSnapshotTestCase.framework */; }; 254A0FE70B70FE015FBD7539ACAE1C2A /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FDAD2E54EFF1515F8C4A834A19BD4D4D /* CoreGraphics.framework */; }; 260BC7EED9289AF321A6F791964CE472 /* EXPMatchers+respondTo.h in Headers */ = {isa = PBXBuildFile; fileRef = 3214E7144907F79B9E41853F678A9C0A /* EXPMatchers+respondTo.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -94,7 +91,6 @@ 4197E03FDA7F3A441F3EE75A81CFDB49 /* SPTExample.h in Headers */ = {isa = PBXBuildFile; fileRef = B1DCDFD17FF06F63308DE46F3BFFFAA0 /* SPTExample.h */; settings = {ATTRIBUTES = (Public, ); }; }; 42E3334C425DEE96210B9AD1419117B1 /* CodFisResponse.m in Sources */ = {isa = PBXBuildFile; fileRef = B91E50458E09B06C7350186D695DBC4D /* CodFisResponse.m */; }; 46137F5CC368BF38BAF0D0AF81DD8FFE /* EXPMatchers+raise.h in Headers */ = {isa = PBXBuildFile; fileRef = 98C21121C538F176200D7C514EDDE382 /* EXPMatchers+raise.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 464DDF3A79ED9B705AD3D6166B6E8EDA /* PNLocation.h in Headers */ = {isa = PBXBuildFile; fileRef = F82FFD0EF52C387B64835F4EF5897A61 /* PNLocation.h */; settings = {ATTRIBUTES = (Public, ); }; }; 46B7A93D561D73C108EF9F1AA0B2443C /* Pods-PNObject_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = AA1CE72928E46C7F70D4BBE1CD90756D /* Pods-PNObject_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 471FD4F68E27AB26FA2AEBB8B245CEE4 /* NSValue+Expecta.h in Headers */ = {isa = PBXBuildFile; fileRef = 97A2EF7C2A5742694F2A2DC54F4EBF78 /* NSValue+Expecta.h */; settings = {ATTRIBUTES = (Public, ); }; }; 47D16DB1D23CFE027F5BE7F7E391AB4C /* EXPMatchers+FBSnapshotTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 5697D74AA726996C696BC2CB928A7F65 /* EXPMatchers+FBSnapshotTest.m */; }; @@ -107,7 +103,6 @@ 4FCB85531CE763D8DA9EA02E5A5218AE /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 217E661EAF3E2F4ED354D0C956D7CF46 /* Foundation.framework */; }; 5056E0520959CBC31CCB037B59BFC847 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0D5258A7C7C196C6D66E415A50BED3E /* UIKit.framework */; }; 5062716982D7B13BBDA758E244EDDC86 /* NSDate_Utils-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F49FB483C9D44C8141AE2AC642AC190 /* NSDate_Utils-dummy.m */; }; - 50DA5F5516678D188C50DA98280957D0 /* PNUser.m in Sources */ = {isa = PBXBuildFile; fileRef = 7622404B68B0D86E320ACA0F5EC7B3CB /* PNUser.m */; }; 51DDDB0FB4899757CF6A826B531B940D /* EXPUnsupportedObject.h in Headers */ = {isa = PBXBuildFile; fileRef = C26BAE5FBBA3A39BAA679642D3CF5988 /* EXPUnsupportedObject.h */; settings = {ATTRIBUTES = (Public, ); }; }; 52B740373BE67500F670E293D6BBCD98 /* UIDevice_Utils.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 43952832E81BEC23457CF90E1A885389 /* UIDevice_Utils.framework */; }; 536CF7EE510D3E5F65EA121F7D6662F6 /* VatNumber+Helper.h in Headers */ = {isa = PBXBuildFile; fileRef = 25E4CD78D9DC3388D3C096161977157A /* VatNumber+Helper.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -127,6 +122,16 @@ 66A27898E989A3FA5C15AA671C4536F0 /* EXPMatchers+beIdenticalTo.m in Sources */ = {isa = PBXBuildFile; fileRef = BF560299FF8A8DFB690547C047A25432 /* EXPMatchers+beIdenticalTo.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 67459AD239EF669A365519E06B45DCFE /* EXPExpect.h in Headers */ = {isa = PBXBuildFile; fileRef = DC6CFAF47DD5EAA5D62AA2F4660BF69B /* EXPExpect.h */; settings = {ATTRIBUTES = (Public, ); }; }; 68152D921ABF6A423C192C04FDF94F0F /* AFNetworkReachabilityManager.h in Headers */ = {isa = PBXBuildFile; fileRef = C311DF9B86CD8FC191B34A8700A4A8B1 /* AFNetworkReachabilityManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 688652F41C58FC4700DE3A8C /* PNInstallation.h in Headers */ = {isa = PBXBuildFile; fileRef = 688652EC1C58FC4700DE3A8C /* PNInstallation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 688652F51C58FC4700DE3A8C /* PNInstallation.m in Sources */ = {isa = PBXBuildFile; fileRef = 688652ED1C58FC4700DE3A8C /* PNInstallation.m */; }; + 688652F71C58FC4700DE3A8C /* PNAddress.h in Headers */ = {isa = PBXBuildFile; fileRef = 688652EE1C58FC4700DE3A8C /* PNAddress.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 688652F81C58FC4700DE3A8C /* PNAddress.m in Sources */ = {isa = PBXBuildFile; fileRef = 688652EF1C58FC4700DE3A8C /* PNAddress.m */; }; + 688652FA1C58FC4700DE3A8C /* PNLocation.h in Headers */ = {isa = PBXBuildFile; fileRef = 688652F01C58FC4700DE3A8C /* PNLocation.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 688652FB1C58FC4700DE3A8C /* PNLocation.m in Sources */ = {isa = PBXBuildFile; fileRef = 688652F11C58FC4700DE3A8C /* PNLocation.m */; }; + 688652FD1C58FC4700DE3A8C /* PNUser.h in Headers */ = {isa = PBXBuildFile; fileRef = 688652F21C58FC4700DE3A8C /* PNUser.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 688652FE1C58FC4700DE3A8C /* PNUser.m in Sources */ = {isa = PBXBuildFile; fileRef = 688652F31C58FC4700DE3A8C /* PNUser.m */; }; + 688653021C58FC9300DE3A8C /* PNAccessToken.h in Headers */ = {isa = PBXBuildFile; fileRef = 688653001C58FC9300DE3A8C /* PNAccessToken.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 688653031C58FC9300DE3A8C /* PNAccessToken.m in Sources */ = {isa = PBXBuildFile; fileRef = 688653011C58FC9300DE3A8C /* PNAccessToken.m */; }; 68A38977EBAE334DC3C22386D00D2622 /* AFNetworkReachabilityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 45970A12B4B6EADF2C4F30D8DD555942 /* AFNetworkReachabilityManager.m */; }; 6C9ED8EB0D104ACB954E769C53179C31 /* PNObject-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 4D21BA597DC54DA5B79874658C865E54 /* PNObject-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6E1D978790705E137FDE439AA68DD3AA /* EXPFloatTuple.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C7F7D98F2EBB8A63EC1D00F426373D6 /* EXPFloatTuple.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -173,7 +178,6 @@ 94C47C87E397972CE98F75929F3B706C /* ExpectaObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 4D3497DD164B46024D6F570A27240CA3 /* ExpectaObject.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; 96B72F9EF4A81EAEE69ADC94D01532EC /* NSDate_Utils.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B7A4A1AF265490E2BF029E44BA1FD092 /* NSDate_Utils.framework */; }; 977F46642C9F38995626A886AB82A9EF /* PNObjectConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 8C6EB895F41E45E5ACAE92A3F79079BE /* PNObjectConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 990FFB828B741EAB752396637A9903A3 /* PNAddress.h in Headers */ = {isa = PBXBuildFile; fileRef = 8C1323DA3A193EB9DF55905B4B76D8A9 /* PNAddress.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9ADA87A0C728B40942CF872F0CC1032D /* NSString+Helper.h in Headers */ = {isa = PBXBuildFile; fileRef = B99E2F02BB1F3CCF5718A7397824F3CE /* NSString+Helper.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9AE45B9B3830204D2DDAD19E2BF4E880 /* Pods-PNObject_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E46B7AFFF2CB3F42C731CF9CFA5DFC85 /* Pods-PNObject_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9B2E761A064459F77EA9870BEF03ACC3 /* EXPMatchers+postNotification.h in Headers */ = {isa = PBXBuildFile; fileRef = C56A27E858830DE4C079B82C72E3D4B9 /* EXPMatchers+postNotification.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -202,7 +206,6 @@ B6A71178B550B786C5D4956197806582 /* nv-ios-http-status-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = FFA7EB19D33C17F1D531E81DA6540F8A /* nv-ios-http-status-dummy.m */; }; B84431CF8C64F363A334AA7089F6C134 /* NSValue+Expecta.m in Sources */ = {isa = PBXBuildFile; fileRef = E24AB18BBD9330583C23DF76B3DA5788 /* NSValue+Expecta.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; BA12B131F10BCE3BE6E9A02FC908FE9D /* EXPMatchers+beCloseTo.m in Sources */ = {isa = PBXBuildFile; fileRef = A7E4F6DD6DC11798A5FEDF845170F677 /* EXPMatchers+beCloseTo.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; - BAEAFACAFC43FCE7BEB8DBC7E03AF1B5 /* PNUser.h in Headers */ = {isa = PBXBuildFile; fileRef = C914C3354FE67AFD984C9481CB66313D /* PNUser.h */; settings = {ATTRIBUTES = (Public, ); }; }; BC55C8365AEFF8217F6A567607754854 /* EXPDoubleTuple.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E3E44DDF755BFF6EF70B8017FE57DF8 /* EXPDoubleTuple.m */; settings = {COMPILER_FLAGS = "-fno-objc-arc"; }; }; BE463D2C7553FDDD4C16487F4A71FCA6 /* ResponseConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B3DFAF22932E7E8494A97A36DC2FC68 /* ResponseConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; BEE08B6146639F0CF458E225239F9F04 /* CodFis-Helper-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A6C9FA19B6BE7794F79DB36ED2970C63 /* CodFis-Helper-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -237,7 +240,6 @@ E0D4045AC4C1B41917FCA23A042D18B2 /* AFHTTPSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = AA707E1B5C617F754CDAFE8E276DCAB1 /* AFHTTPSessionManager.m */; }; E10811B5E4578C31FB675361C99EDED6 /* UIImage+Compare.h in Headers */ = {isa = PBXBuildFile; fileRef = 6922AB8ABF38E31420E0AD20364FA8F1 /* UIImage+Compare.h */; settings = {ATTRIBUTES = (Private, ); }; }; E1EC4532663CA75DE5BD00CB0A56814D /* Expecta.h in Headers */ = {isa = PBXBuildFile; fileRef = B0F970F4305D2627DCDBCCD3F0FE5CB6 /* Expecta.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E2446B173C33DA9F1DAB1620FC794CAC /* PNLocation.m in Sources */ = {isa = PBXBuildFile; fileRef = C03113EF70A6E88A2E055C521DB18222 /* PNLocation.m */; }; E3C61206BEDBA3EBAA0A69B51DE0F3AA /* FBSnapshotTestCasePlatform.m in Sources */ = {isa = PBXBuildFile; fileRef = 30EF4DA4A4CDB81D9176875A747F9A29 /* FBSnapshotTestCasePlatform.m */; }; E4EC16570D46F25B3BD2830D65C06AE5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 217E661EAF3E2F4ED354D0C956D7CF46 /* Foundation.framework */; }; E735386085CE344F6A01178CF4763852 /* EXPMatchers+beNil.h in Headers */ = {isa = PBXBuildFile; fileRef = DFB1E8448416A0C4E0C6FFDA083A711B /* EXPMatchers+beNil.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -561,7 +563,6 @@ 217E661EAF3E2F4ED354D0C956D7CF46 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 218AF1ECF876B28B484AD438E085D491 /* PNObject.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = PNObject.xcconfig; sourceTree = ""; }; 220DA9C6C346A61FA71D0B37836628A5 /* EXPMatchers+beGreaterThan.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beGreaterThan.h"; path = "Expecta/Matchers/EXPMatchers+beGreaterThan.h"; sourceTree = ""; }; - 222A85499B021E976CA2C6E97354362D /* PNObjectProperty.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PNObjectProperty.h; sourceTree = ""; }; 23B424944C0E1FDF29B4CD790D97D04C /* StrongestPasswordValidator.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = StrongestPasswordValidator.m; path = Pod/Classes/StrongestPasswordValidator.m; sourceTree = ""; }; 2457EC270A54B38F9D0CE51B29C83FD1 /* NSString-Helper-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "NSString-Helper-prefix.pch"; sourceTree = ""; }; 24861D9EDF6A0490D414329EE5A19852 /* EXPMatchers+beLessThan.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beLessThan.h"; path = "Expecta/Matchers/EXPMatchers+beLessThan.h"; sourceTree = ""; }; @@ -631,7 +632,6 @@ 54BC8E2E1C4BFF322A7188FC8BB41255 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 54EE338F56B707DBB1444B0ACF9C8614 /* Expecta-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Expecta-umbrella.h"; sourceTree = ""; }; 55134BC07FB77579484BE59525B15D03 /* Expecta-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Expecta-dummy.m"; sourceTree = ""; }; - 554AFB0F246CEC2AD06F032D0860EED8 /* PNAddress.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = PNAddress.m; sourceTree = ""; }; 5697D74AA726996C696BC2CB928A7F65 /* EXPMatchers+FBSnapshotTest.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "EXPMatchers+FBSnapshotTest.m"; sourceTree = ""; }; 57F5319149F36EBD129D3E914372E8C6 /* FBSnapshotTestCase-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FBSnapshotTestCase-dummy.m"; sourceTree = ""; }; 58FD2F9B07A480F1C786F0E58BA3D919 /* StrongestPasswordValidator.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StrongestPasswordValidator.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -650,6 +650,16 @@ 66C8B02C4B4D7F89FDFD569187797016 /* SPTTestSuite.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SPTTestSuite.m; path = Specta/Specta/SPTTestSuite.m; sourceTree = ""; }; 66EF034BB9EC4B36DA83F1F484FC0780 /* EXPMatchers+beInTheRangeOf.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beInTheRangeOf.m"; path = "Expecta/Matchers/EXPMatchers+beInTheRangeOf.m"; sourceTree = ""; }; 681E7ACB247E65B384C7F6F20A16C3BB /* SPTExampleGroup.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SPTExampleGroup.m; path = Specta/Specta/SPTExampleGroup.m; sourceTree = ""; }; + 688652EC1C58FC4700DE3A8C /* PNInstallation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PNInstallation.h; sourceTree = ""; }; + 688652ED1C58FC4700DE3A8C /* PNInstallation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PNInstallation.m; sourceTree = ""; }; + 688652EE1C58FC4700DE3A8C /* PNAddress.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PNAddress.h; sourceTree = ""; }; + 688652EF1C58FC4700DE3A8C /* PNAddress.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PNAddress.m; sourceTree = ""; }; + 688652F01C58FC4700DE3A8C /* PNLocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PNLocation.h; sourceTree = ""; }; + 688652F11C58FC4700DE3A8C /* PNLocation.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PNLocation.m; sourceTree = ""; }; + 688652F21C58FC4700DE3A8C /* PNUser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PNUser.h; sourceTree = ""; }; + 688652F31C58FC4700DE3A8C /* PNUser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PNUser.m; sourceTree = ""; }; + 688653001C58FC9300DE3A8C /* PNAccessToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PNAccessToken.h; sourceTree = ""; }; + 688653011C58FC9300DE3A8C /* PNAccessToken.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PNAccessToken.m; sourceTree = ""; }; 6922AB8ABF38E31420E0AD20364FA8F1 /* UIImage+Compare.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Compare.h"; path = "FBSnapshotTestCase/Categories/UIImage+Compare.h"; sourceTree = ""; }; 6B3DFAF22932E7E8494A97A36DC2FC68 /* ResponseConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = ResponseConstants.h; path = "CodFis-Helper/ResponseConstants.h"; sourceTree = ""; }; 6BABE32DD14BA4EADAAFB828CB0956A2 /* PEARFileManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = PEARFileManager.m; path = "PEAR-FileManager-iOS/PEARFileManager.m"; sourceTree = ""; }; @@ -668,7 +678,6 @@ 746CA7A82B13C15477DFF68AE7D16AB2 /* EXPDefines.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPDefines.h; path = Expecta/EXPDefines.h; sourceTree = ""; }; 748E0B295CE6475615F29850C6CD4B0A /* Pods-PNObject_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-PNObject_Tests-acknowledgements.plist"; sourceTree = ""; }; 755C724DF7C66825A534B30580023744 /* EXPMatchers+beGreaterThanOrEqualTo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beGreaterThanOrEqualTo.h"; path = "Expecta/Matchers/EXPMatchers+beGreaterThanOrEqualTo.h"; sourceTree = ""; }; - 7622404B68B0D86E320ACA0F5EC7B3CB /* PNUser.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = PNUser.m; sourceTree = ""; }; 76E4195F1B1B499B1F54C3053A6C4F09 /* AFURLResponseSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLResponseSerialization.m; path = AFNetworking/AFURLResponseSerialization.m; sourceTree = ""; }; 7A09A844498D0BE9ECEF19919560448F /* ResourceBundle-PNObject-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-PNObject-Info.plist"; sourceTree = ""; }; 7A3C32CEB67871682E5571ACF002551F /* NSDate_Utils-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "NSDate_Utils-prefix.pch"; sourceTree = ""; }; @@ -692,7 +701,6 @@ 8A42D327C01AB49661866A8872FF648A /* UIImage+Compare.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Compare.m"; path = "FBSnapshotTestCase/Categories/UIImage+Compare.m"; sourceTree = ""; }; 8B19FF74975D7F1CA531A21E040E8019 /* nv_ios_http_status.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = nv_ios_http_status.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 8BB72137A8F13429C1BF5591AE2CFE19 /* SpectaTypes.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SpectaTypes.h; path = Specta/Specta/SpectaTypes.h; sourceTree = ""; }; - 8C1323DA3A193EB9DF55905B4B76D8A9 /* PNAddress.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PNAddress.h; sourceTree = ""; }; 8C6EB895F41E45E5ACAE92A3F79079BE /* PNObjectConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PNObjectConstants.h; sourceTree = ""; }; 8E5ACB32168438B4CDD3297AA5B10F4C /* PEAR-FileManager-iOS-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "PEAR-FileManager-iOS-umbrella.h"; sourceTree = ""; }; 8F0824DFA6D9E5E507F52EE56442639A /* EXPMatchers+beInTheRangeOf.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "EXPMatchers+beInTheRangeOf.h"; path = "Expecta/Matchers/EXPMatchers+beInTheRangeOf.h"; sourceTree = ""; }; @@ -764,7 +772,6 @@ BD437CFF5220FD456F3573973B16FC0D /* EXPExpect.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = EXPExpect.m; path = Expecta/EXPExpect.m; sourceTree = ""; }; BF560299FF8A8DFB690547C047A25432 /* EXPMatchers+beIdenticalTo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beIdenticalTo.m"; path = "Expecta/Matchers/EXPMatchers+beIdenticalTo.m"; sourceTree = ""; }; BFA83496360A1C5FC68BB5EFE4E1B5B1 /* EXPMatchers+beInstanceOf.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beInstanceOf.m"; path = "Expecta/Matchers/EXPMatchers+beInstanceOf.m"; sourceTree = ""; }; - C03113EF70A6E88A2E055C521DB18222 /* PNLocation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = PNLocation.m; sourceTree = ""; }; C0D5258A7C7C196C6D66E415A50BED3E /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.2.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; C1258E99DF8888B37ACBBC6C90F91DCB /* Expecta_Snapshots.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Expecta_Snapshots.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C1633EDD69D7AD9BE6A5097201FABA1B /* CodFisResponse.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = CodFisResponse.h; path = "CodFis-Helper/CodFisResponse.h"; sourceTree = ""; }; @@ -777,7 +784,6 @@ C622F48C2080CE18FC7822DB091925F2 /* AFNetworking-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AFNetworking-dummy.m"; sourceTree = ""; }; C6EDBEF6F7E5F84A65FCD53B25F4E499 /* nv_ios_http_status.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = nv_ios_http_status.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C8D94483E26E496780A7A65A1BBF6707 /* EXPMatcherHelpers.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPMatcherHelpers.h; path = Expecta/Matchers/EXPMatcherHelpers.h; sourceTree = ""; }; - C914C3354FE67AFD984C9481CB66313D /* PNUser.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PNUser.h; sourceTree = ""; }; CA822B4C4A4F2E1BA28DDDC4EF21A29B /* FBSnapshotTestCase.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FBSnapshotTestCase.framework; sourceTree = BUILT_PRODUCTS_DIR; }; CACE8E60049A91DDF14CEF6898EDE337 /* UIWebView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIWebView+AFNetworking.m"; path = "UIKit+AFNetworking/UIWebView+AFNetworking.m"; sourceTree = ""; }; CAEE05DD29E53EA8CED0EE307ED5DE99 /* NSString_Helper.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = NSString_Helper.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -788,7 +794,6 @@ D3C1A35567252A04C711B7FD8A6AFD36 /* NSString-Helper.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "NSString-Helper.modulemap"; sourceTree = ""; }; D44DCC649D1B53CB110501A06FB5E860 /* Specta.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = Specta.modulemap; sourceTree = ""; }; D521EC5C05CDD367928AC44A372C2C07 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.2.sdk/System/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; - D64E5FBEECD5F45817771685FE53E7CC /* PNObjectProperty.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = PNObjectProperty.m; sourceTree = ""; }; D6838B2171CE90FB5D2B82FB2DC2329C /* Specta-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Specta-prefix.pch"; sourceTree = ""; }; D711F932EF0B66455153299015509775 /* EXPMatchers+beTruthy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "EXPMatchers+beTruthy.m"; path = "Expecta/Matchers/EXPMatchers+beTruthy.m"; sourceTree = ""; }; D761BAE2437C826AB810C023C228E54E /* PNObject.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = PNObject.modulemap; sourceTree = ""; }; @@ -835,7 +840,6 @@ F7BE9BC01546854F415DD8A1ADC1DBA4 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; F7E9946D6C67863BECC19C8B644EBB57 /* SPTExcludeGlobalBeforeAfterEach.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SPTExcludeGlobalBeforeAfterEach.h; path = Specta/Specta/SPTExcludeGlobalBeforeAfterEach.h; sourceTree = ""; }; F81AC9273F266A430070C76D06C67C2B /* CodFis-Helper.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "sourcecode.module-map"; path = "CodFis-Helper.modulemap"; sourceTree = ""; }; - F82FFD0EF52C387B64835F4EF5897A61 /* PNLocation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = PNLocation.h; sourceTree = ""; }; F872FBD57D98CFC3DE47AD9A270264B9 /* Pods-PNObject_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PNObject_Tests.release.xcconfig"; sourceTree = ""; }; F87C61A16E4071BC8BB8D415DB46B9F4 /* Expecta.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Expecta.xcconfig; sourceTree = ""; }; F8C8B23D3335F3A9D5717F0FDD850D61 /* EXPDoubleTuple.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = EXPDoubleTuple.h; path = Expecta/EXPDoubleTuple.h; sourceTree = ""; }; @@ -1289,9 +1293,7 @@ 8C6EB895F41E45E5ACAE92A3F79079BE /* PNObjectConstants.h */, 3BCD3F5B2F25EC20E951FA2F6F5AAE1C /* PNObjectModel.h */, E901CF7EF4389BF53294E255EC216EA9 /* PNObjectModel.m */, - 222A85499B021E976CA2C6E97354362D /* PNObjectProperty.h */, - D64E5FBEECD5F45817771685FE53E7CC /* PNObjectProperty.m */, - E563BE33781776A049A78E580278AA6E /* User */, + 688652EB1C58FC4700DE3A8C /* PNClasses */, ); path = Classes; sourceTree = ""; @@ -1371,6 +1373,23 @@ name = Core; sourceTree = ""; }; + 688652EB1C58FC4700DE3A8C /* PNClasses */ = { + isa = PBXGroup; + children = ( + 688653001C58FC9300DE3A8C /* PNAccessToken.h */, + 688653011C58FC9300DE3A8C /* PNAccessToken.m */, + 688652EC1C58FC4700DE3A8C /* PNInstallation.h */, + 688652ED1C58FC4700DE3A8C /* PNInstallation.m */, + 688652EE1C58FC4700DE3A8C /* PNAddress.h */, + 688652EF1C58FC4700DE3A8C /* PNAddress.m */, + 688652F01C58FC4700DE3A8C /* PNLocation.h */, + 688652F11C58FC4700DE3A8C /* PNLocation.m */, + 688652F21C58FC4700DE3A8C /* PNUser.h */, + 688652F31C58FC4700DE3A8C /* PNUser.m */, + ); + path = PNClasses; + sourceTree = ""; + }; 7158B238A3AD46264223DDCD4A86E6C9 /* Products */ = { isa = PBXGroup; children = ( @@ -1711,19 +1730,6 @@ name = Pods; sourceTree = ""; }; - E563BE33781776A049A78E580278AA6E /* User */ = { - isa = PBXGroup; - children = ( - 8C1323DA3A193EB9DF55905B4B76D8A9 /* PNAddress.h */, - 554AFB0F246CEC2AD06F032D0860EED8 /* PNAddress.m */, - F82FFD0EF52C387B64835F4EF5897A61 /* PNLocation.h */, - C03113EF70A6E88A2E055C521DB18222 /* PNLocation.m */, - C914C3354FE67AFD984C9481CB66313D /* PNUser.h */, - 7622404B68B0D86E320ACA0F5EC7B3CB /* PNUser.m */, - ); - path = User; - sourceTree = ""; - }; E99CD5B3CF7131277C4CBA3A1162D56A /* Development Pods */ = { isa = PBXGroup; children = ( @@ -1749,17 +1755,18 @@ isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 990FFB828B741EAB752396637A9903A3 /* PNAddress.h in Headers */, - 464DDF3A79ED9B705AD3D6166B6E8EDA /* PNLocation.h in Headers */, 60CA030266D48CD0B748D7A61AB68415 /* PNObject+PNObjectConnection.h in Headers */, - 07A88B9F8DA0FCF2BEECDDDAF81F5784 /* PNObject+Protected.h in Headers */, 6C9ED8EB0D104ACB954E769C53179C31 /* PNObject-umbrella.h in Headers */, E017DCB48E855511717607C17F81A0D3 /* PNObject.h in Headers */, + 688652FD1C58FC4700DE3A8C /* PNUser.h in Headers */, + 688652F41C58FC4700DE3A8C /* PNInstallation.h in Headers */, 83EE2536C479C8377672768025B76A48 /* PNObjectConfig.h in Headers */, 977F46642C9F38995626A886AB82A9EF /* PNObjectConstants.h in Headers */, + 688652F71C58FC4700DE3A8C /* PNAddress.h in Headers */, + 688652FA1C58FC4700DE3A8C /* PNLocation.h in Headers */, + 07A88B9F8DA0FCF2BEECDDDAF81F5784 /* PNObject+Protected.h in Headers */, + 688653021C58FC9300DE3A8C /* PNAccessToken.h in Headers */, CE6C7F1B6792307BA4C313236EF21905 /* PNObjectModel.h in Headers */, - 0CF0A5CCA7F6B01D347DDC64E3005133 /* PNObjectProperty.h in Headers */, - BAEAFACAFC43FCE7BEB8DBC7E03AF1B5 /* PNUser.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2641,16 +2648,17 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2397A06DC7FB975B63932706F7DF0BC8 /* PNAddress.m in Sources */, - E2446B173C33DA9F1DAB1620FC794CAC /* PNLocation.m in Sources */, 3C7B1DC5F3EEDCAE9CBBF5BF43A38AA2 /* PNObject+PNObjectConnection.m in Sources */, + 688652FB1C58FC4700DE3A8C /* PNLocation.m in Sources */, + 688652F51C58FC4700DE3A8C /* PNInstallation.m in Sources */, + 688652FE1C58FC4700DE3A8C /* PNUser.m in Sources */, 06CDD49E8FC6C70C6B5E7D2AB488ADDB /* PNObject+Protected.m in Sources */, AE07BF4F276DBA12AE1CB00858FC931D /* PNObject-dummy.m in Sources */, 3DF6B5F4A5746B7116FB3E9032233849 /* PNObject.m in Sources */, + 688653031C58FC9300DE3A8C /* PNAccessToken.m in Sources */, + 688652F81C58FC4700DE3A8C /* PNAddress.m in Sources */, 3493E2B06558B90423B62FEAD843E0AB /* PNObjectConfig.m in Sources */, 2F29183F6BEC29A366A8BA92D39690CC /* PNObjectModel.m in Sources */, - 11D8963BA2226E54AE47D011AF9221AA /* PNObjectProperty.m in Sources */, - 50DA5F5516678D188C50DA98280957D0 /* PNUser.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/PNObject.podspec b/PNObject.podspec index 0ad0c16..8ed2022 100644 --- a/PNObject.podspec +++ b/PNObject.podspec @@ -8,7 +8,7 @@ Pod::Spec.new do |s| s.name = "PNObject" -s.version = "0.2.1" +s.version = "0.2.3" s.summary = "PNObject is a simple replica of the more complex ParseObject" # This description is used to generate tags and improve search results. diff --git a/Pod/Classes/PNClasses/PNAccessToken.h b/Pod/Classes/PNClasses/PNAccessToken.h new file mode 100644 index 0000000..0ac01c8 --- /dev/null +++ b/Pod/Classes/PNClasses/PNAccessToken.h @@ -0,0 +1,30 @@ +// +// PNAccessToken.h +// Pods +// +// Created by Giuseppe Nucifora on 27/01/16. +// +// + +#import + +@interface PNAccessToken : PNObject + +typedef NS_ENUM(NSInteger, TokenType) { + TokenTypeBasic = 1, + TokenTypeBearer = 2 +}; +/** + * <#Description#> + */ +@property (nonatomic, strong, nullable) NSString *accessToken; +/** + * <#Description#> + */ +@property (nonatomic, strong, nullable) NSDate *expirationDate; +/** + * <#Description#> + */ +@property (nonatomic) TokenType tokenType; + +@end diff --git a/Pod/Classes/PNClasses/PNAccessToken.m b/Pod/Classes/PNClasses/PNAccessToken.m new file mode 100644 index 0000000..b3ba879 --- /dev/null +++ b/Pod/Classes/PNClasses/PNAccessToken.m @@ -0,0 +1,44 @@ +// +// PNAccessToken.m +// Pods +// +// Created by Giuseppe Nucifora on 27/01/16. +// +// + +#import "PNAccessToken.h" + +@interface PNAccessToken() + +@end + +@implementation PNAccessToken + +#pragma mark PNObjectSubclassing Protocol + ++ (NSDictionary *)objcetMapping { + + NSDictionary *mapping = @{ + @"accessToken":@"accessToken", + @"expirationDate":@"expirationDate", + @"tokenType":@"tokenType", + }; + return mapping; +} + ++ (NSString *)objectClassName { + return @"AccessToken"; +} + ++ (BOOL) singleInstance { + return YES; +} + +#pragma mark - + + + + + + +@end diff --git a/Pod/Classes/PNClasses/PNAddress.h b/Pod/Classes/PNClasses/PNAddress.h new file mode 100644 index 0000000..f806d2b --- /dev/null +++ b/Pod/Classes/PNClasses/PNAddress.h @@ -0,0 +1,51 @@ +// +// PNAddress.h +// Pods +// +// Created by Giuseppe Nucifora on 13/01/16. +// +// + +#import "PNObject.h" +#import "PNLocation.h" + +@interface PNAddress : PNObject + +///-------------------------------------- +#pragma mark - PNAddress Properties +///-------------------------------------- + +/** + * <#Description#> + */ +@property (nonatomic, strong, nullable) NSString * country; +/** + * <#Description#> + */ +@property (nonatomic, strong, nullable) NSString * province; +/** + * <#Description#> + */ +@property (nonatomic, strong, nullable) NSString * city; +/** + * <#Description#> + */ +@property (nonatomic, strong, nullable) NSString * street; +/** + * <#Description#> + */ +@property (nonatomic, strong, nullable) NSNumber * number; +/** + * <#Description#> + */ +@property (nonatomic, strong, nullable) NSString * zip; +/** + * <#Description#> + */ +@property (nonatomic, strong, nullable) NSString * istruction; +/** + * <#Description#> + */ +@property (nonatomic, strong, nullable) PNLocation * location; + +@end diff --git a/Pod/Classes/User/PNAddress.m b/Pod/Classes/PNClasses/PNAddress.m similarity index 100% rename from Pod/Classes/User/PNAddress.m rename to Pod/Classes/PNClasses/PNAddress.m diff --git a/Pod/Classes/PNClasses/PNInstallation.h b/Pod/Classes/PNClasses/PNInstallation.h new file mode 100644 index 0000000..df9ba12 --- /dev/null +++ b/Pod/Classes/PNClasses/PNInstallation.h @@ -0,0 +1,59 @@ +// +// PNInstallation.h +// Pods +// +// Created by Giuseppe Nucifora on 27/01/16. +// +// + +#import + +@interface PNInstallation : PNObject + +/** + Gets the currently-running installation from disk and returns an instance of it. + + If this installation is not stored on disk, returns a `PFInstallation` + with `deviceType` and `installationId` fields set to those of the + current installation. + + @result Returns a `Installation` that represents the currently-running installation. + */ ++ (instancetype _Nonnull)currentInstallation; + +- (void)setDeviceTokenFromData:(nullable NSData *)deviceTokenData; + +///-------------------------------------- +#pragma mark - PNInstallation Properties +///-------------------------------------- + +/** + * <#Description#> + */ +@property (nonatomic, strong, readonly, nonnull) NSString *deviceType; +/** + * <#Description#> + */ +@property (nonatomic, strong, readonly, nonnull) NSString *deviceModel; +/** + * <#Description#> + */ +@property (nonatomic, strong, readonly, nonnull) NSString *deviceName; +/** + * <#Description#> + */ +@property (nonatomic, strong, readonly, nonnull) NSString *osVersion; +/** + * <#Description#> + */ +@property (nonatomic, strong, readonly, nonnull) NSString *localeIdentifier; +/** + * <#Description#> + */ +@property (nonatomic, strong, readonly, nullable) NSString *deviceToken; +/** + * <#Description#> + */ +@property (nonatomic, assign) NSInteger badge; + +@end diff --git a/Pod/Classes/PNClasses/PNInstallation.m b/Pod/Classes/PNClasses/PNInstallation.m new file mode 100644 index 0000000..bdf7486 --- /dev/null +++ b/Pod/Classes/PNClasses/PNInstallation.m @@ -0,0 +1,111 @@ +// +// PNInstallation.m +// Pods +// +// Created by Giuseppe Nucifora on 27/01/16. +// +// + +#import "PNInstallation.h" + +@interface PNInstallation() + +/** + * <#Description#> + */ +@property (nonatomic, strong, nullable) NSData *deviceTokenData; + +@end + +@implementation PNInstallation + +static PNInstallation *SINGLETON = nil; + +static bool isFirstAccess = YES; + +#pragma mark PNObjectSubclassing Protocol + ++ (NSDictionary *)objcetMapping { + + NSDictionary *mapping = @{ + @"deviceType":@"deviceType", + @"deviceModel":@"deviceModel", + @"deviceName":@"deviceName", + @"osVersion":@"osVersion", + @"deviceToken":@"deviceToken", + @"badge":@"badge", + @"localeIdentifier":@"localeIdentifier", + }; + return mapping; +} + ++ (NSString *)objectClassName { + return @"AccessToken"; +} + ++ (BOOL) singleInstance { + return YES; +} + +#pragma mark - + +#pragma mark Public Methods + + ++ (instancetype) currentInstallation { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + isFirstAccess = NO; + + SINGLETON = [[super allocWithZone:NULL] init]; + }); + + return SINGLETON; +} + +- (void)setDeviceTokenFromData:(NSData *)deviceTokenData { + + _deviceTokenData = deviceTokenData; + + NSString *ptoken = [[[[deviceTokenData description] + stringByReplacingOccurrencesOfString:@"<"withString:@""] + stringByReplacingOccurrencesOfString:@">" withString:@""] + stringByReplacingOccurrencesOfString: @" " withString: @""]; + + _deviceToken = ptoken; +} + +#pragma mark - + +#pragma mark Private Methods + +- (id) init +{ + if(SINGLETON){ + return SINGLETON; + } + if (isFirstAccess) { + [self doesNotRecognizeSelector:_cmd]; + } + + NSDictionary *savedInstallation = [[PNObjectModel sharedInstance] fetchObjectsWithClass:[self class]]; + + if (savedInstallation) { + self = [super initWithJSON:savedInstallation]; + } + else { + self = [super init]; + } + + if (self) { + + _deviceModel = [[UIDevice currentDevice] model]; + _osVersion = [[UIDevice currentDevice] systemVersion];; + _deviceName = [[UIDevice currentDevice] name];; + } + return self; +} + +#pragma mark - + +@end diff --git a/Pod/Classes/User/PNLocation.h b/Pod/Classes/PNClasses/PNLocation.h similarity index 57% rename from Pod/Classes/User/PNLocation.h rename to Pod/Classes/PNClasses/PNLocation.h index 7800337..b3b3b87 100644 --- a/Pod/Classes/User/PNLocation.h +++ b/Pod/Classes/PNClasses/PNLocation.h @@ -10,7 +10,17 @@ @interface PNLocation : PNObject +///-------------------------------------- +#pragma mark - PNLocation Properties +///-------------------------------------- + +/** + * <#Description#> + */ @property (nonatomic) CGFloat lat; +/** + * <#Description#> + */ @property (nonatomic) CGFloat lng; @end diff --git a/Pod/Classes/User/PNLocation.m b/Pod/Classes/PNClasses/PNLocation.m similarity index 100% rename from Pod/Classes/User/PNLocation.m rename to Pod/Classes/PNClasses/PNLocation.m diff --git a/Pod/Classes/PNClasses/PNUser.h b/Pod/Classes/PNClasses/PNUser.h new file mode 100644 index 0000000..5ffdaac --- /dev/null +++ b/Pod/Classes/PNClasses/PNUser.h @@ -0,0 +1,103 @@ +// +// PNUser.h +// Pods +// +// Created by Giuseppe Nucifora on 15/01/16. +// +// + +#import "PNObject.h" + + +@interface PNUser : PNObject + +/** + * gets singleton object of current user session. + * + * @return singleton + */ ++ (instancetype _Nonnull) currentUser; + +- (BOOL) isValidPassword:(NSString* _Nonnull) password; + +//- (void) setPassword:(NSString * _Nonnull)password inBackGroundWithBlock:(nullable void (^)(BOOL saveStatus, id responseObject, NSError * error)) responseBlock; + +///-------------------------------------- +#pragma mark - PNLocation Properties +///-------------------------------------- + +/** + * <#Description#> + */ +@property (strong, nonatomic, nonnull) NSString * userId; +/** + * <#Description#> + */ +@property (strong, nonatomic, nonnull) NSString * firstName; +/** + * <#Description#> + */ +@property (strong, nonatomic, nonnull) NSString * lastName; +/** + * <#Description#> + */ +@property (nonatomic, strong, nullable) UIImage * profileImage; +/** + * <#Description#> + */ +@property (nonatomic, strong, nullable) NSString * sex; +/** + * <#Description#> + */ +@property (nonatomic, strong, nullable) NSDate * birthDate; +/** + * <#Description#> + */ +@property (nonatomic, strong, nullable) NSString * phone; +/** + * <#Description#> + */ +@property (nonatomic) BOOL hasAcceptedPrivacy; +/** + * <#Description#> + */ +@property (nonatomic) BOOL hasAcceptedNewsletter; +/** + * <#Description#> + */ +@property (nonatomic) BOOL hasVerifiedEmail; +/** + * <#Description#> + */ +@property (nonatomic, strong, nullable) NSDate * emailVerifiedDate; +/** + * <#Description#> + */ +@property (nonatomic, strong, nonnull) NSString * email; +/** + * <#Description#> + */ +@property (nonatomic, strong, nonnull) NSString * username; +/** + * <#Description#> + */ +@property (nonatomic, strong, nonnull) NSString * password; +/** + * <#Description#> + */ +@property (nonatomic) BOOL publicProfile; +/** + * <#Description#> + */ +@property (nonatomic, strong, nonnull) NSNumber * loginCount; +/** + * <#Description#> + */ +@property (nonatomic, strong, nullable) NSString * facebookId; +/** + * <#Description#> + */ +@property (nonatomic, strong, nullable) NSString * facebookAccessToken; + + +@end diff --git a/Pod/Classes/PNClasses/PNUser.m b/Pod/Classes/PNClasses/PNUser.m new file mode 100644 index 0000000..1e5ea8c --- /dev/null +++ b/Pod/Classes/PNClasses/PNUser.m @@ -0,0 +1,156 @@ +// +// PNUser.m +// Pods +// +// Created by Giuseppe Nucifora on 15/01/16. +// +// + +#import "PNUser.h" +#import "NSString+Helper.h" +#import "PNObjectConstants.h" +#import "PNObject+Protected.h" + + +@interface PNUser() + +@end + +@implementation PNUser + +@synthesize password = _password; + +static PNUser *SINGLETON = nil; + +static bool isFirstAccess = YES; + +#pragma mark - Public Method + ++ (instancetype) currentUser { + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + isFirstAccess = NO; + + SINGLETON = [[super allocWithZone:NULL] init]; + }); + + return SINGLETON; +} + +#pragma mark - Life Cycle + ++ (instancetype) allocWithZone:(NSZone *)zone +{ + return [self currentUser]; +} + ++ (instancetype)copyWithZone:(struct _NSZone *)zone +{ + return [self currentUser]; +} + ++ (instancetype)mutableCopyWithZone:(struct _NSZone *)zone +{ + return [self currentUser]; +} + +- (instancetype)copy +{ + return [[PNUser alloc] init]; +} + +- (instancetype)mutableCopy +{ + return [[PNUser alloc] init]; +} + +- (id) init +{ + if(SINGLETON){ + return SINGLETON; + } + if (isFirstAccess) { + [self doesNotRecognizeSelector:_cmd]; + } + + NSDictionary *savedUser = [[PNObjectModel sharedInstance] fetchObjectsWithClass:[self class]]; + + if (savedUser) { + self = [super initWithJSON:savedUser]; + } + else { + self = [super init]; + } + + if (self) { + } + return self; +} + +- (void) setEmail:(NSString *)email { + if ([email isValidEmail]) { + _email = email; + } + NSLogDebug(@"insertedEmail is not valid."); +} + +- (void) setPassword:(NSString *)password { + if ([self isValidPassword:password]) { + _password = password; + } + else { + NSLogDebug(@"Inserted Passord is not valid.Lenght must be >= %ld",(long)[[PNObjectConfig sharedInstance] minPasswordLenght]); + } +} + +- (BOOL) isValidPassword:(NSString* _Nonnull) password { + if ([password length] >= [[PNObjectConfig sharedInstance] minPasswordLenght]) { + return YES; + } + return NO; +} + + +- (NSString *) password { + return @"password is not readble"; +} + +#pragma mark PNObjectSubclassing Protocol + ++ (NSDictionary *)objcetMapping { + + NSDictionary *mapping = @{ + @"userId":@"id", + @"firstName":@"firstName", + @"lastName":@"lastName", + @"profileImage":@"profileImage", + @"sex":@"sex", + @"birthDate":@"birthDate", + @"phone":@"phone", + @"password":@"password", + @"hasAcceptedPrivacy":@"hasAcceptedPrivacy", + @"hasAcceptedNewsletter":@"hasAcceptedNewsletter", + @"hasVerifiedEmail":@"hasVerifiedEmail", + @"emailVerifiedDate":@"emailVerifiedDate", + @"email":@"email", + @"username":@"username", + @"publicProfile":@"public_profile", + @"loginCount":@"login_count", + @"facebookId":@"facebookId", + @"facebookAccessToken":@"facebookAccessToken", + }; + return mapping; +} + ++ (NSString *)objectClassName { + return @"User"; +} + ++ (BOOL) singleInstance { + return YES; +} + +#pragma mark - + + +@end diff --git a/Pod/Classes/PNObject+Protected.h b/Pod/Classes/PNObject+Protected.h index 14f0dc1..a4db4a8 100644 --- a/Pod/Classes/PNObject+Protected.h +++ b/Pod/Classes/PNObject+Protected.h @@ -7,24 +7,57 @@ // #import -#import @interface PNObject (Protected) +/** + * <#Description#> + * + * @param JSON <#JSON description#> + */ +- (void)populateObjectFromJSON:(id _Nullable)JSON; +/** + * <#Description#> + * + * @param obj <#obj description#> + * + * @return <#return value description#> + */ +- (BOOL)isObjNull:(id _Nullable)obj; +/** + * <#Description#> + * + * @return <#return value description#> + */ ++ (NSArray * _Nonnull) protectedProperties; +/** + * <#Description#> + * + * @param PNObjClass <#PNObjClass description#> + * + * @return <#return value description#> + */ ++ (NSDictionary * _Nullable)propertiesForClass:(Class _Nonnull)PNObjClass; -@property (nonatomic, strong) PNObjectModel * _Nonnull objectModel; - -@property (nonatomic, strong) NSDictionary * _Nonnull JSON; - -@property (nonatomic, strong) NSString * _Nonnull endPoint; +///-------------------------------------- +#pragma mark - PNObject (Protected) Properties +///-------------------------------------- +/** + * <#Description#> + */ +@property (nonatomic, strong, nonnull) PNObjectModel * objectModel; +/** + * <#Description#> + */ +@property (nonatomic, strong, nonnull) NSDictionary * JSON; +/** + * <#Description#> + */ +@property (nonatomic, strong, nonnull) NSString * endPoint; +/** + * <#Description#> + */ @property (nonatomic) BOOL singleInstance; -- (void)populateObjectFromJSON:(id _Nullable)JSON; - -- (BOOL)isStringNull:(NSString * _Nullable)str; - -- (BOOL)isObjNull:(id _Nullable)obj; - -+ (NSArray * _Nonnull) protectedProperties; @end diff --git a/Pod/Classes/PNObject+Protected.m b/Pod/Classes/PNObject+Protected.m index 715df34..29579e3 100644 --- a/Pod/Classes/PNObject+Protected.m +++ b/Pod/Classes/PNObject+Protected.m @@ -7,9 +7,9 @@ // #import "PNObject+Protected.h" -#import #import "PNObjectConstants.h" #import +#import "objc/runtime.h" @implementation PNObject (Protected) @@ -18,130 +18,194 @@ @dynamic JSON; @dynamic singleInstance; -+ (PNObjectModel* _Nonnull) objectModel { - -} - + (NSArray * _Nonnull) protectedProperties { - return @[@"JSON",@"subClassDelegate",@"objectModel",@"objectMapping",@"singleInstance"]; + return @[@"JSON",@"objectModel",@"objectMapping",@"singleInstance"]; } - (void)populateObjectFromJSON:(id _Nullable)JSON { - NSDictionary *properties = [PNObjectProperty propertiesForClass:self.class]; - - for(NSString *propertyName in properties) { - - if([propertyName isEqualToString:@"mappingError"]) - continue; - - NSString *mappedJSONKey; - NSString *mappedJSONType; - - NSString *propertyType = [properties valueForKey:propertyName]; - - id mappingValue = [self.objectMapping valueForKey:propertyName]; - - if([mappingValue isKindOfClass:NSDictionary.class]) { - mappedJSONKey = [mappingValue valueForKey:@"key"]; - mappedJSONType = [mappingValue valueForKey:@"type"]; - } else { - mappedJSONKey = mappingValue; - } - - - if ([[PNObject protectedProperties] containsObject:propertyName]) { - continue; - } - - // Get JSON value for the mapped key - id value = [JSON valueForKeyPath:propertyName]; - - - ((void (^)())@{ - @"c" : ^{ - char val = [value charValue]; - [self setValue:@(val) forKey:propertyName]; - }, - @"d" : ^{ - double val = [value doubleValue]; - [self setValue:@(val) forKey:propertyName]; - }, - @"f" : ^{ - float val = [value floatValue]; - [self setValue:@(val) forKey:propertyName]; - }, - @"i" : ^{ - int val = [value intValue]; - [self setValue:@(val) forKey:propertyName]; - }, - @"l" : ^{ - long val = [value longValue]; - [self setValue:@(val) forKey:propertyName]; - }, - @"s" : ^{ - short val = [value shortValue]; - [self setValue:@(val) forKey:propertyName]; - }, - @"B" : ^{ - BOOL val = [value boolValue]; - [self setValue:@(val) forKey:propertyName]; - }, - @"NSString" : ^{ - if (![self isObjNull:value]) { - [self setValue:value forKey:propertyName]; - } - - }, - @"NSNumber" : ^{ - NSInteger val = [value integerValue]; - [self setValue:@(val) forKey:propertyName]; - }, - @"NSDate" : ^{ - NSString *str = [NSString stringWithFormat:@"%@", value]; - NSDate *val = [[NSDate dateFromString:str withFormat:kNSDateHelperFormatSQLDateWithTime] toLocalTime]; - if (![self isObjNull:val]) { - [self setValue:val forKey:propertyName]; - } - }, - @"NSArray" : ^{ - NSMutableArray *arr = [NSMutableArray array]; - for(id JSONObject in value) { - PNObject *val = [[NSClassFromString(mappedJSONType) alloc] initWithJSON:JSONObject]; - [arr addObject:val]; - } - - [self setValue:arr forKey:propertyName]; - }, - @"NSMutableArray" : ^{ - NSMutableArray *arr = [NSMutableArray array]; - for(id JSONObject in value) { - PNObject *val = [[NSClassFromString(mappedJSONType) alloc] initWithJSON:JSONObject]; - [arr addObject:val]; - } - - [self setValue:arr forKey:propertyName]; - } - }[propertyType] ?: ^{ - BOOL isPNObjectSubclass = [NSClassFromString(propertyType) isSubclassOfClass:[PNObject class]]; - if(isPNObjectSubclass) { - PNObject *val = [[NSClassFromString(propertyType) alloc] initWithJSON:value]; - [self setValue:val forKey:propertyName]; - } - else { - NSString *errorStr = [NSString stringWithFormat:@"Property '%@' could not be assigned any value.", propertyName]; - NSLogDebug(@"%@",errorStr); - } - })(); - } + NSDictionary *properties = [PNObject propertiesForClass:self.class]; + + for(NSString *propertyName in properties) { + + if([propertyName isEqualToString:@"mappingError"]) + continue; + + NSString *mappedJSONKey; + NSString *mappedJSONType; + + NSString *propertyType = [properties valueForKey:propertyName]; + + id mappingValue = [self.objectMapping valueForKey:propertyName]; + + if([mappingValue isKindOfClass:NSDictionary.class]) { + mappedJSONKey = [mappingValue valueForKey:@"key"]; + mappedJSONType = [mappingValue valueForKey:@"type"]; + } else { + mappedJSONKey = mappingValue; + } + + + if ([[PNObject protectedProperties] containsObject:propertyName]) { + continue; + } + + // Get JSON value for the mapped key + id value = [JSON valueForKeyPath:propertyName]; + + + ((void (^)())@{ + @"c" : ^{ + char val = [value charValue]; + [self setValue:@(val) forKey:propertyName]; + }, + @"d" : ^{ + double val = [value doubleValue]; + [self setValue:@(val) forKey:propertyName]; + }, + @"f" : ^{ + float val = [value floatValue]; + [self setValue:@(val) forKey:propertyName]; + }, + @"i" : ^{ + int val = [value intValue]; + [self setValue:@(val) forKey:propertyName]; + }, + @"l" : ^{ + long val = [value longValue]; + [self setValue:@(val) forKey:propertyName]; + }, + @"s" : ^{ + short val = [value shortValue]; + [self setValue:@(val) forKey:propertyName]; + }, + @"B" : ^{ + BOOL val = [value boolValue]; + [self setValue:@(val) forKey:propertyName]; + }, + @"NSString" : ^{ + if (![self isObjNull:value]) { + [self setValue:value forKey:propertyName]; + } + + }, + @"NSNumber" : ^{ + NSInteger val = [value integerValue]; + [self setValue:@(val) forKey:propertyName]; + }, + @"NSDate" : ^{ + NSString *str = [NSString stringWithFormat:@"%@", value]; + NSDate *val = [[NSDate dateFromString:str withFormat:kNSDateHelperFormatSQLDateWithTime] toLocalTime]; + if (![self isObjNull:val]) { + [self setValue:val forKey:propertyName]; + } + }, + @"NSArray" : ^{ + NSMutableArray *arr = [NSMutableArray array]; + for(id JSONObject in value) { + PNObject *val = [[NSClassFromString(mappedJSONType) alloc] initWithJSON:JSONObject]; + [arr addObject:val]; + } + + [self setValue:arr forKey:propertyName]; + }, + @"NSMutableArray" : ^{ + NSMutableArray *arr = [NSMutableArray array]; + for(id JSONObject in value) { + PNObject *val = [[NSClassFromString(mappedJSONType) alloc] initWithJSON:JSONObject]; + [arr addObject:val]; + } + + [self setValue:arr forKey:propertyName]; + } + }[propertyType] ?: ^{ + BOOL isPNObjectSubclass = [NSClassFromString(propertyType) isSubclassOfClass:[PNObject class]]; + if(isPNObjectSubclass) { + PNObject *val = [[NSClassFromString(propertyType) alloc] initWithJSON:value]; + [self setValue:val forKey:propertyName]; + } + else { + NSString *errorStr = [NSString stringWithFormat:@"Property '%@' could not be assigned any value.", propertyName]; + NSLogDebug(@"%@",errorStr); + } + })(); + } } - (BOOL)isObjNull:(id _Nullable)obj { - if(!obj || nil == obj || NSNull.null == obj || ([obj isKindOfClass:[NSString class]] && [obj isEqualToString:@"(null)"]) || [obj isEqual:[NSNull null]]) - return YES; - else - return NO; + if(!obj || nil == obj || NSNull.null == obj || ([obj isKindOfClass:[NSString class]] && [obj isEqualToString:@"(null)"]) || [obj isEqual:[NSNull null]]) + return YES; + else + return NO; +} + +static BOOL property_getTypeString( objc_property_t property, char *buffer ) +{ + const char * attrs = property_getAttributes( property ); + if ( attrs == NULL ) + return NO; + + const char * e = strchr( attrs, ',' ); + if ( e == NULL ) + return NO; + + int len = (int)(e - attrs); + memcpy( buffer, attrs, len ); + buffer[len] = '\0'; + + return YES; +} + + + ++ (NSDictionary *)propertiesForClass:(Class)PNObjClass +{ + if (PNObjClass == NULL) { + return nil; + } + + NSMutableDictionary *results = [NSMutableDictionary dictionary]; + if ([PNObjClass isSubclassOfClass:[PNObject class]] && PNObjClass != [PNObject class]) { + [results addEntriesFromDictionary:[self propertiesForClass:[PNObject class]]]; + } + + unsigned int outCount, i; + objc_property_t *properties = class_copyPropertyList(PNObjClass, &outCount); + for (i = 0; i < outCount; i++) { + objc_property_t property = properties[i]; + const char *propName = property_getName(property); + if(propName) { + //const char *propType = getPropertyType(property); + char propType[256]; + if (!property_getTypeString(property, propType)) { + continue; + } + NSString *propertyName = [NSString stringWithUTF8String:propName]; + NSString *propertyType = [NSString stringWithUTF8String:propType]; + + NSRange range = [propertyType rangeOfString:@"T@\""]; + NSRange range2 = [propertyType rangeOfString:@"T"]; + if (range.location != NSNotFound) { + NSRange subStrRange = NSMakeRange(range.length, propertyType.length - (range.length + 1)); + propertyType = [propertyType substringWithRange:subStrRange]; + } + else if (range2.location != NSNotFound) { + NSRange subStrRange = NSMakeRange(range2.length, propertyType.length - (range2.length)); + propertyType = [propertyType substringWithRange:subStrRange]; + } + + //NSLogDebug(@"Prop type & name: %@ -- %@", propertyType, propertyName); + + if (![[PNObject protectedProperties] containsObject:propertyName]) { + [results setObject:propertyType forKey:propertyName]; + } + } + } + free(properties); + + // returning a copy here to make sure the dictionary is immutable + return [NSDictionary dictionaryWithDictionary:results]; } @end diff --git a/Pod/Classes/PNObject.h b/Pod/Classes/PNObject.h index a6ab4ef..a9c69dc 100644 --- a/Pod/Classes/PNObject.h +++ b/Pod/Classes/PNObject.h @@ -26,15 +26,28 @@ @interface PNObject : NSObject -@property (nonatomic, strong) NSString * _Nonnull objID; -@property (nonatomic, strong) NSDate * _Nonnull createdAt; -@property (nonatomic, strong, getter=getJSONObject) NSDictionary * _Nonnull objectMapping; -@property (nonatomic, assign) id _Nonnull subClassDelegate; - - (_Nullable instancetype) initWithJSON:( NSDictionary * _Nonnull) JSON; - (id _Nonnull) saveLocally; - (BOOL) autoRemoveLocally; +///-------------------------------------- +#pragma mark - PNObject Properties +///-------------------------------------- + +/** + * <#Description#> + */ +@property (nonatomic, strong, nonnull) NSString * objID; +/** + * <#Description#> + */ +@property (nonatomic, strong, nonnull) NSDate * createdAt; +/** + * <#Description#> + */ +@property (nonatomic, strong, getter=getJSONObject, nonnull) NSDictionary * objectMapping; + + @end diff --git a/Pod/Classes/PNObject.m b/Pod/Classes/PNObject.m index 83eddcf..4c7260c 100644 --- a/Pod/Classes/PNObject.m +++ b/Pod/Classes/PNObject.m @@ -7,7 +7,6 @@ // #import "PNObject.h" -#import #import #import #import "PNObject/PNUser.h" @@ -17,7 +16,7 @@ #define PNOBJECT_DIR @"PNObjects" -@interface PNObject() +@interface PNObject() @property (nonatomic, strong) PNObjectModel * _Nonnull objectModel; @@ -31,265 +30,277 @@ @implementation PNObject -- (NSDictionary *) PNObjectMapping { - NSDictionary *mapping = @{@"objID":@"objID", - @"createdAt":@"created_at", - }; - return mapping; +#pragma mark PNObjectSubclassing + ++ (NSDictionary *) objcetMapping { + NSDictionary *mapping = @{@"objID":@"objID", + @"createdAt":@"created_at", + }; + return mapping; } ++ (BOOL) singleInstance { + return NO; +} + ++ (NSString*) objectClassName { + return @"PNObject"; +} + +#pragma mark - + - (_Nullable instancetype) init { - self = [super init]; - - if (self) { - if ([[self class] isSubclassOfClass:[PNObject class]]) { - - NSAssert([[self class] conformsToProtocol:@protocol(PNObjectSubclassing)], @"Subclass object must conform to PNObjectSubclassing"); - - _objID = [[NSProcessInfo processInfo] globallyUniqueString]; - - _objectModel = [PNObjectModel sharedInstance]; - [_objectModel setPersistencyDelegate:self]; - - NSMutableDictionary * objectDict = [[NSMutableDictionary alloc] initWithDictionary:[[self class] objcetMapping]]; - [objectDict addEntriesFromDictionary:[self PNObjectMapping]]; - - _objectMapping = objectDict; - - NSAssert(_objectMapping, @"You must create objectMapping"); - - _singleInstance = [[self class] singleInstance]; - - _createdAt = [[NSDate date] toLocalTime]; - - } - } - return self; + self = [super init]; + + if (self) { + if ([[self class] isSubclassOfClass:[PNObject class]]) { + + NSAssert([[self class] conformsToProtocol:@protocol(PNObjectSubclassing)], @"Subclass object must conform to PNObjectSubclassing"); + + _objID = [[NSProcessInfo processInfo] globallyUniqueString]; + + _objectModel = [PNObjectModel sharedInstance]; + [_objectModel setPersistencyDelegate:self]; + + NSMutableDictionary * objectDict = [[NSMutableDictionary alloc] initWithDictionary:[[self class] objcetMapping]]; + [objectDict addEntriesFromDictionary:[PNObject objcetMapping]]; + + _objectMapping = objectDict; + + NSAssert(_objectMapping, @"You must create objectMapping"); + + _singleInstance = [[self class] singleInstance]; + + _createdAt = [[NSDate date] toLocalTime]; + + } + } + return self; } - (_Nullable instancetype) initWithJSON:( NSDictionary * _Nonnull) JSON { - self = [super init]; - if (self) { - if ([[self class] isSubclassOfClass:[PNObject class]]) { - NSAssert([[self class] conformsToProtocol:@protocol(PNObjectSubclassing)], @"Subclass object must conform to PNObjectSubclassing"); - - _objID = [[NSProcessInfo processInfo] globallyUniqueString]; - - _objectModel = [PNObjectModel sharedInstance]; - [_objectModel setPersistencyDelegate:self]; - - NSMutableDictionary * objectDict = [[NSMutableDictionary alloc] initWithDictionary:[[self class] objcetMapping]]; - [objectDict addEntriesFromDictionary:[self PNObjectMapping]]; - - _objectMapping = objectDict; - - NSAssert(_objectMapping, @"You must create objectMapping"); - - _singleInstance = [[self class] singleInstance]; - - _createdAt = [[NSDate date] toLocalTime]; - - } - - NSAssert(_objectMapping, @"You must create objectMapping"); - _JSON = [[NSMutableDictionary alloc] initWithDictionary:JSON]; - - [self populateObjectFromJSON:_JSON]; - } - return self; + self = [super init]; + if (self) { + if ([[self class] isSubclassOfClass:[PNObject class]]) { + NSAssert([[self class] conformsToProtocol:@protocol(PNObjectSubclassing)], @"Subclass object must conform to PNObjectSubclassing"); + + _objID = [[NSProcessInfo processInfo] globallyUniqueString]; + + _objectModel = [PNObjectModel sharedInstance]; + [_objectModel setPersistencyDelegate:self]; + + NSMutableDictionary * objectDict = [[NSMutableDictionary alloc] initWithDictionary:[[self class] objcetMapping]]; + [objectDict addEntriesFromDictionary:[PNObject objcetMapping]]; + + _objectMapping = objectDict; + + NSAssert(_objectMapping, @"You must create objectMapping"); + + _singleInstance = [[self class] singleInstance]; + + _createdAt = [[NSDate date] toLocalTime]; + + } + + NSAssert(_objectMapping, @"You must create objectMapping"); + _JSON = [[NSMutableDictionary alloc] initWithDictionary:JSON]; + + [self populateObjectFromJSON:_JSON]; + } + return self; } - (NSDictionary * _Nonnull)reverseMapping { - NSMutableDictionary *JSON = [NSMutableDictionary dictionary]; - - NSString *mappedJSONKey; - NSString *mappedJSONType; - - NSDictionary *properties = [PNObjectProperty propertiesForClass:self.class]; - - for (NSString* propertyName in _objectMapping) { - id mappingValue = [_objectMapping objectForKey:propertyName]; - - if([mappingValue isKindOfClass:NSDictionary.class]) { - mappedJSONKey = [mappingValue valueForKey:@"key"]; - mappedJSONType = [mappingValue valueForKey:@"type"]; - } else { - mappedJSONKey = mappingValue; - } - - NSString *propertyType = [properties valueForKey:propertyName]; - - id value = [self valueForKey:propertyName]; - - NSLog(@"PropertyName PropertyType Value: %@ - %@ - %@",propertyName,propertyType,value); - - ((void (^)())@{ - @"c" : ^{ - char val = [value charValue]; - [JSON setValue:@(val) forKey:propertyName]; - }, - @"d" : ^{ - double val = [value doubleValue]; - [JSON setValue:@(val) forKey:propertyName]; - }, - @"f" : ^{ - float val = [value floatValue]; - [JSON setValue:@(val) forKey:propertyName]; - }, - @"i" : ^{ - int val = [value intValue]; - [JSON setValue:@(val) forKey:propertyName]; - }, - @"l" : ^{ - long val = [value longValue]; - [JSON setValue:@(val) forKey:propertyName]; - }, - @"s" : ^{ - short val = [value shortValue]; - [JSON setValue:@(val) forKey:propertyName]; - }, - @"B" : ^{ - BOOL val = [value boolValue]; - [JSON setValue:@(val) forKey:propertyName]; - }, - - @"UIImage" : ^{ - UIImage *image = [UIImage imageWithData:value]; - [JSON setValue:image forKey:propertyName]; - }, - @"NSURL" : ^{ - NSURL *url = value; - - if (![self isObjNull:url]) { - [JSON setValue:[url absoluteString] forKey:propertyName]; - } - }, - @"NSString" : ^{ - NSString *val = [NSString stringWithFormat:@"%@", value]; - if (![self isObjNull:val]) { - [JSON setValue:val forKey:propertyName]; - } - }, - @"NSNumber" : ^{ - NSInteger val = [value integerValue]; - [JSON setValue:@(val) forKey:propertyName]; - }, - @"NSDate" : ^{ - NSDate *val = [value toLocalTime]; - if (![self isObjNull:val]) { - [JSON setValue:val forKey:propertyName]; - } - }, - @"NSArray" : ^{ - NSMutableArray *arr = [NSMutableArray array]; - for(id PNObject in value) { - SEL selector = NSSelectorFromString(@"getJSONObject"); - NSInvocation *invocation = [NSInvocation invocationWithMethodSignature: [[PNObject class] instanceMethodSignatureForSelector:selector]]; - [invocation setSelector:selector]; - [invocation setTarget:PNObject]; - [invocation invoke]; - NSDictionary *returnValue; - [invocation getReturnValue:&returnValue]; - - [arr addObject:returnValue]; - } - - [JSON setValue:arr forKey:propertyName]; - }, - @"NSMutableArray" : ^{ - NSMutableArray *arr = [NSMutableArray array]; - for(id JSONObject in value) { - PNObject *val = [[NSClassFromString(mappedJSONType) alloc] initWithJSON:JSONObject]; - [arr addObject:val]; - - SEL selector = NSSelectorFromString(@"getJSONObject"); - NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[[PNObject class] instanceMethodSignatureForSelector:selector]]; - [invocation setSelector:selector]; - [invocation setTarget:value]; - [invocation invoke]; - NSDictionary *returnValue; - [invocation getReturnValue:&returnValue]; - } - - [JSON setValue:arr forKey:propertyName]; - } - }[propertyType] ?: ^{ - BOOL isPNObjectSubclass = [NSClassFromString(propertyType) isSubclassOfClass:[PNObject class]]; - if(isPNObjectSubclass) { - SEL selector = NSSelectorFromString(@"getJSONObject"); - NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[[PNObject class] instanceMethodSignatureForSelector:selector]]; - [invocation setSelector:selector]; - [invocation setTarget:value]; - [invocation invoke]; - NSDictionary *returnValue; - [invocation getReturnValue:&returnValue]; - - [JSON setValue:returnValue forKey:propertyName]; - } - else { - // do nothing - } - })(); - - - - - } - - _JSON = JSON; - - return _JSON; + NSMutableDictionary *JSON = [NSMutableDictionary dictionary]; + + NSString *mappedJSONKey; + NSString *mappedJSONType; + + NSDictionary *properties = [PNObject propertiesForClass:self.class]; + + for (NSString* propertyName in _objectMapping) { + id mappingValue = [_objectMapping objectForKey:propertyName]; + + if([mappingValue isKindOfClass:NSDictionary.class]) { + mappedJSONKey = [mappingValue valueForKey:@"key"]; + mappedJSONType = [mappingValue valueForKey:@"type"]; + } else { + mappedJSONKey = mappingValue; + } + + NSString *propertyType = [properties valueForKey:propertyName]; + + id value = [self valueForKey:propertyName]; + + NSLog(@"PropertyName PropertyType Value: %@ - %@ - %@",propertyName,propertyType,value); + + ((void (^)())@{ + @"c" : ^{ + char val = [value charValue]; + [JSON setValue:@(val) forKey:propertyName]; + }, + @"d" : ^{ + double val = [value doubleValue]; + [JSON setValue:@(val) forKey:propertyName]; + }, + @"f" : ^{ + float val = [value floatValue]; + [JSON setValue:@(val) forKey:propertyName]; + }, + @"i" : ^{ + int val = [value intValue]; + [JSON setValue:@(val) forKey:propertyName]; + }, + @"l" : ^{ + long val = [value longValue]; + [JSON setValue:@(val) forKey:propertyName]; + }, + @"s" : ^{ + short val = [value shortValue]; + [JSON setValue:@(val) forKey:propertyName]; + }, + @"B" : ^{ + BOOL val = [value boolValue]; + [JSON setValue:@(val) forKey:propertyName]; + }, + + @"UIImage" : ^{ + UIImage *image = [UIImage imageWithData:value]; + [JSON setValue:image forKey:propertyName]; + }, + @"NSURL" : ^{ + NSURL *url = value; + + if (![self isObjNull:url]) { + [JSON setValue:[url absoluteString] forKey:propertyName]; + } + }, + @"NSString" : ^{ + NSString *val = [NSString stringWithFormat:@"%@", value]; + if (![self isObjNull:val]) { + [JSON setValue:val forKey:propertyName]; + } + }, + @"NSNumber" : ^{ + NSInteger val = [value integerValue]; + [JSON setValue:@(val) forKey:propertyName]; + }, + @"NSDate" : ^{ + NSDate *val = [value toLocalTime]; + if (![self isObjNull:val]) { + [JSON setValue:val forKey:propertyName]; + } + }, + @"NSArray" : ^{ + NSMutableArray *arr = [NSMutableArray array]; + for(id PNObject in value) { + SEL selector = NSSelectorFromString(@"getJSONObject"); + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature: [[PNObject class] instanceMethodSignatureForSelector:selector]]; + [invocation setSelector:selector]; + [invocation setTarget:PNObject]; + [invocation invoke]; + NSDictionary *returnValue; + [invocation getReturnValue:&returnValue]; + + [arr addObject:returnValue]; + } + + [JSON setValue:arr forKey:propertyName]; + }, + @"NSMutableArray" : ^{ + NSMutableArray *arr = [NSMutableArray array]; + for(id JSONObject in value) { + PNObject *val = [[NSClassFromString(mappedJSONType) alloc] initWithJSON:JSONObject]; + [arr addObject:val]; + + SEL selector = NSSelectorFromString(@"getJSONObject"); + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[[PNObject class] instanceMethodSignatureForSelector:selector]]; + [invocation setSelector:selector]; + [invocation setTarget:value]; + [invocation invoke]; + NSDictionary *returnValue; + [invocation getReturnValue:&returnValue]; + } + + [JSON setValue:arr forKey:propertyName]; + } + }[propertyType] ?: ^{ + BOOL isPNObjectSubclass = [NSClassFromString(propertyType) isSubclassOfClass:[PNObject class]]; + if(isPNObjectSubclass) { + SEL selector = NSSelectorFromString(@"getJSONObject"); + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[[PNObject class] instanceMethodSignatureForSelector:selector]]; + [invocation setSelector:selector]; + [invocation setTarget:value]; + [invocation invoke]; + NSDictionary *returnValue; + [invocation getReturnValue:&returnValue]; + + [JSON setValue:returnValue forKey:propertyName]; + } + else { + // do nothing + } + })(); + + + + + } + + _JSON = JSON; + + return _JSON; } - (NSDictionary* _Nonnull) getJSONObject { - return [self reverseMapping]; + return [self reverseMapping]; } - (NSString* _Nonnull) description { - if (!_JSON) { - return [[self reverseMapping] description]; - } - return [_JSON description]; + if (!_JSON) { + return [[self reverseMapping] description]; + } + return [_JSON description]; } - (void) setSingleInstance:(BOOL)singleInstance { - _singleInstance = singleInstance; + _singleInstance = singleInstance; } #pragma mark PNObjectPersistency protocol - (BOOL) initObjectPersistency { - - BOOL isDir=YES; - NSError *error; - - NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; - - NSFileManager *fileManager= [NSFileManager defaultManager]; - - if(![fileManager fileExistsAtPath:[docDir stringByAppendingFormat:@"/%@",PNOBJECT_DIR] isDirectory:&isDir]) { - - if (![[NSFileManager defaultManager] createDirectoryAtPath:[docDir stringByAppendingFormat:@"/%@",PNOBJECT_DIR] withIntermediateDirectories:NO attributes:nil error:&error]) { + + BOOL isDir=YES; + NSError *error; + + NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; + + NSFileManager *fileManager= [NSFileManager defaultManager]; + + if(![fileManager fileExistsAtPath:[docDir stringByAppendingFormat:@"/%@",PNOBJECT_DIR] isDirectory:&isDir]) { + + if (![[NSFileManager defaultManager] createDirectoryAtPath:[docDir stringByAppendingFormat:@"/%@",PNOBJECT_DIR] withIntermediateDirectories:NO attributes:nil error:&error]) { #ifdef DEBUG - NSLogDebug(@"Create directory error: %@", error); + NSLogDebug(@"Create directory error: %@", error); #endif - return NO; - } - } + return NO; + } + } #ifdef DEBUG - NSLogDebug(@"%@",[docDir stringByAppendingFormat:@"/%@",PNOBJECT_DIR]); + NSLogDebug(@"%@",[docDir stringByAppendingFormat:@"/%@",PNOBJECT_DIR]); #endif - return YES; + return YES; } - (id _Nonnull) saveLocally { - - return [_objectModel saveLocally:self]; + + return [_objectModel saveLocally:self]; } - (BOOL) autoRemoveLocally { - return [_objectModel removeObjectLocally:self]; + return [_objectModel removeObjectLocally:self]; } #pragma mark - diff --git a/Pod/Classes/PNObjectConfig.h b/Pod/Classes/PNObjectConfig.h index d7fcf66..5a7437b 100644 --- a/Pod/Classes/PNObjectConfig.h +++ b/Pod/Classes/PNObjectConfig.h @@ -10,19 +10,17 @@ #import typedef NS_ENUM(NSInteger, Environment) { - Development, - Stage, - Production + Development, + Stage, + Production }; extern NSString* const EnvironmentProduction; extern NSString* const EnvironmentStage; extern NSString* const EnvironmentDevelopment; -@interface PNObjectConfig : NSObject -@property (nonatomic, strong) AFHTTPSessionManager *manager; -@property (nonatomic) NSInteger minPasswordLenght; +@interface PNObjectConfig : NSObject /** * gets singleton object. @@ -44,10 +42,38 @@ extern NSString* const EnvironmentDevelopment; */ + (instancetype) initSharedInstanceForEnvironments:(NSDictionary *) endpointUrlsForEnvironments; +/** + * <#Description#> + * + * @param env <#env description#> + */ - (void) setEnvironment:(Environment) env; +/** + * <#Description#> + * + * @return <#return value description#> + */ - (NSString *) PNObjEndpoint; +/** + * <#Description#> + * + * @param passLenght <#passLenght description#> + */ - (void) setAcceptablePasswordLenght:(NSUInteger) passLenght; + +///-------------------------------------- +#pragma mark - PNObjectConfig Properties +///-------------------------------------- +/** + * <#Description#> + */ +@property (nonatomic, strong) AFHTTPSessionManager *manager; +/** + * <#Description#> + */ +@property (nonatomic) NSInteger minPasswordLenght; + @end \ No newline at end of file diff --git a/Pod/Classes/PNObjectModel.h b/Pod/Classes/PNObjectModel.h index e3c4be0..ac4f93e 100644 --- a/Pod/Classes/PNObjectModel.h +++ b/Pod/Classes/PNObjectModel.h @@ -18,10 +18,19 @@ @interface PNObjectModel : NSObject -@property (nonatomic, assign) id _Nonnull persistencyDelegate; +@property (nonatomic, assign, nonnull) id persistencyDelegate; + (_Nonnull instancetype) sharedInstance; +/** + * <#Description#> + * + * @param class <#class description#> + * + * @return <#return value description#> + */ +- (id _Nonnull) fetchObjectsWithClass:(Class _Nonnull) class; + /** * <#Description#> * @@ -32,6 +41,15 @@ */ - (id _Nonnull) saveLocally:(id _Nonnull) object; +/** + * <#Description#> + * + * @param object <#object description#> + * + * @return <#return value description#> + */ +- (id _Nonnull) saveNSUSerDefautls:(id _Nonnull) object; + /** * <#Description#> * @@ -41,6 +59,6 @@ */ - (BOOL) removeObjectLocally:(id _Nonnull) object; -- (id _Nonnull) fetchObjectsWithClass:(Class _Nonnull) class; + @end diff --git a/Pod/Classes/PNObjectModel.m b/Pod/Classes/PNObjectModel.m index 6850e55..fd4fecc 100644 --- a/Pod/Classes/PNObjectModel.m +++ b/Pod/Classes/PNObjectModel.m @@ -27,251 +27,256 @@ static bool isFirstAccess = YES; + (instancetype) sharedInstance { - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - isFirstAccess = NO; - SINGLETON = [[super allocWithZone:NULL] init]; - }); - - return SINGLETON; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + isFirstAccess = NO; + SINGLETON = [[super allocWithZone:NULL] init]; + }); + + return SINGLETON; } - (NSString * _Nullable) objectName:(id _Nonnull) object { - - BOOL isPNObjectSubclass = [[object class] isSubclassOfClass:[PNObject class]]; - - if(isPNObjectSubclass) { - - if ([[object class] conformsToProtocol:@protocol(PNObjectSubclassing)]) { - - NSString *className; - //if ([[object subClassDelegate] respondsToSelector:@selector(objectClassName)]) { - - @try { - - className = (NSString *)[[object class] performSelector:@selector(objectClassName)]; - - } - @catch (NSException *exception) { - return nil; - } - @finally { - return className; - } - - - //} - } - } - return nil; + + BOOL isPNObjectSubclass = [[object class] isSubclassOfClass:[PNObject class]]; + + if(isPNObjectSubclass) { + + if ([[object class] conformsToProtocol:@protocol(PNObjectSubclassing)]) { + + NSString *className; + //if ([[object subClassDelegate] respondsToSelector:@selector(objectClassName)]) { + + @try { + + className = (NSString *)[[object class] performSelector:@selector(objectClassName)]; + + } + @catch (NSException *exception) { + return nil; + } + @finally { + return className; + } + + + //} + } + } + return nil; } - (BOOL) issetPNObjectModelForObject:(id _Nonnull) object { - - NSString *className = [self objectName:object]; - - if (!className) { - return NO; - } - - return [_fileManager checkPath:className]; + + NSString *className = [self objectName:object]; + + if (!className) { + return NO; + } + + return [_fileManager checkPath:className]; } #pragma mark - + (id) allocWithZone:(NSZone *)zone { - return [self sharedInstance]; + return [self sharedInstance]; } + (id)copyWithZone:(struct _NSZone *)zone { - return [self sharedInstance]; + return [self sharedInstance]; } + (id)mutableCopyWithZone:(struct _NSZone *)zone { - return [self sharedInstance]; + return [self sharedInstance]; } - (id)copy { - return [[PNObjectModel alloc] init]; + return [[PNObjectModel alloc] init]; } - (id)mutableCopy { - return [[PNObjectModel alloc] init]; + return [[PNObjectModel alloc] init]; } - (id) init { - if(SINGLETON){ - return SINGLETON; - } - if (isFirstAccess) { - [self doesNotRecognizeSelector:_cmd]; - } - self = [super init]; - - if (self) { - _fileManager = [PEARFileManager sharedInstatnce]; - - [_fileManager setRootDirectory:k_ROOT_DIR_DOCUMENTS]; - NSLogDebug(@"%@",[_fileManager getRootDirectoryPath]); - } - return self; + if(SINGLETON){ + return SINGLETON; + } + if (isFirstAccess) { + [self doesNotRecognizeSelector:_cmd]; + } + self = [super init]; + + if (self) { + _fileManager = [PEARFileManager sharedInstatnce]; + + [_fileManager setRootDirectory:k_ROOT_DIR_DOCUMENTS]; + NSLogDebug(@"%@",[_fileManager getRootDirectoryPath]); + } + return self; } +#pragma mark Public Methods + - (id _Nonnull) fetchObjectsWithClass:(Class _Nonnull) class { - BOOL isPNObjectSubclass = [class isSubclassOfClass:[PNObject class]]; - - if(isPNObjectSubclass) { - - NSString *className; - - @try { - - className = (NSString *)[class performSelector:@selector(objectClassName)]; - - } - @catch (NSException *exception) { - - } - @finally { - - if ([_fileManager checkPath:className]) { - return [NSKeyedUnarchiver unarchiveObjectWithData:[_fileManager fetchFileDataWithPath:className]]; - } - else - return nil; - } - } + BOOL isPNObjectSubclass = [class isSubclassOfClass:[PNObject class]]; + + if(isPNObjectSubclass) { + + NSString *className; + + @try { + + className = (NSString *)[class performSelector:@selector(objectClassName)]; + + } + @catch (NSException *exception) { + + } + @finally { + + if ([_fileManager checkPath:className]) { + return [NSKeyedUnarchiver unarchiveObjectWithData:[_fileManager fetchFileDataWithPath:className]]; + } + else + return nil; + } + } } - - (id _Nonnull) saveLocally:(id _Nonnull) object { - - BOOL isPNObjectSubclass = [[object class] isSubclassOfClass:[PNObject class]]; - - if(isPNObjectSubclass) { - - if ([[object class] conformsToProtocol:@protocol(PNObjectSubclassing)]) { - - if ([(PNObject*) object singleInstance]) { - - SEL selector = NSSelectorFromString(@"getJSONObject"); - NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[[PNObject class] instanceMethodSignatureForSelector:selector]]; - [invocation setSelector:selector]; - [invocation setTarget:object]; - [invocation invoke]; - - NSDictionary *objectDict; - [invocation getReturnValue:&objectDict]; - - NSLogDebug(@"%@",objectDict); - - NSData *objectData = [NSKeyedArchiver archivedDataWithRootObject:objectDict]; - - if ([self issetPNObjectModelForObject:object]) { - if ([_fileManager updateFileWithData:objectData filePath:[self objectName:object] permisson:@(0755)]) { - return object; - } - else { - return [NSError errorWithDomain:NSLocalizedString(@"Object cannot be updated", @"") code:kHTTPStatusCodeBadRequest userInfo:nil]; - } - } - else { - if ([_fileManager createFileWithData:objectData filePath:[self objectName:object] permisson:@(0755)]) { - return object; - } - else { - return [NSError errorWithDomain:NSLocalizedString(@"Object cannot be created", @"") code:kHTTPStatusCodeBadRequest userInfo:nil]; - } - } - } - else { - if ([self issetPNObjectModelForObject:object]) { - - NSData * data = [_fileManager fetchFileDataWithPath:[self objectName:object]]; - - NSMutableArray *objects = [[NSMutableArray alloc] initWithArray:[NSKeyedUnarchiver unarchiveObjectWithData:data]]; - - - SEL selector = NSSelectorFromString(@"getJSONObject"); - NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[[PNObject class] instanceMethodSignatureForSelector:selector]]; - [invocation setSelector:selector]; - [invocation setTarget:object]; - [invocation invoke]; - - NSDictionary *objectDict; - [invocation getReturnValue:&objectDict]; - - NSLogDebug(@"%@",objectDict); - - [objects addObject:objectDict]; - - NSData *objectData = [NSKeyedArchiver archivedDataWithRootObject:objects]; - - if ([_fileManager updateFileWithData:objectData filePath:[self objectName:object] permisson:@(0755)]) { - - return objects; - } - else { - return [NSError errorWithDomain:NSLocalizedString(@"Objects list cannot be updated", @"") code:kHTTPStatusCodeBadRequest userInfo:nil]; - } - } - else { - - NSMutableArray *objects = [[NSMutableArray alloc] init]; - - - SEL selector = NSSelectorFromString(@"getJSONObject"); - NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[[PNObject class] instanceMethodSignatureForSelector:selector]]; - [invocation setSelector:selector]; - [invocation setTarget:object]; - [invocation invoke]; - - NSDictionary *objectDict; - [invocation getReturnValue:&objectDict]; - - NSLogDebug(@"%@",objectDict); - - [objects addObject:objectDict]; - - NSData *objectData = [NSKeyedArchiver archivedDataWithRootObject:objects]; - - if ([_fileManager createFileWithData:objectData filePath:[self objectName:object] permisson:@(0755)]) { - return object; - } - else { - return [NSError errorWithDomain:NSLocalizedString(@"Objects list cannot be created", @"") code:kHTTPStatusCodeBadRequest userInfo:nil]; - } - } - } - } - else { - return [NSError errorWithDomain:NSLocalizedString(@"passed object is not conform to protocol PNObjectSubclassing", @"") code:kHTTPStatusCodeBadRequest userInfo:nil]; - } - } - else { - return [NSError errorWithDomain:NSLocalizedString(@"passed object is not PNObject Subclass", @"") code:kHTTPStatusCodeBadRequest userInfo:nil]; - } + + BOOL isPNObjectSubclass = [[object class] isSubclassOfClass:[PNObject class]]; + + if(isPNObjectSubclass) { + + if ([[object class] conformsToProtocol:@protocol(PNObjectSubclassing)]) { + + if ([(PNObject*) object singleInstance]) { + + SEL selector = NSSelectorFromString(@"getJSONObject"); + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[[PNObject class] instanceMethodSignatureForSelector:selector]]; + [invocation setSelector:selector]; + [invocation setTarget:object]; + [invocation invoke]; + + NSDictionary *objectDict; + [invocation getReturnValue:&objectDict]; + + NSLogDebug(@"%@",objectDict); + + NSData *objectData = [NSKeyedArchiver archivedDataWithRootObject:objectDict]; + + if ([self issetPNObjectModelForObject:object]) { + if ([_fileManager updateFileWithData:objectData filePath:[self objectName:object] permisson:@(0755)]) { + return object; + } + else { + return [NSError errorWithDomain:NSLocalizedString(@"Object cannot be updated", @"") code:kHTTPStatusCodeBadRequest userInfo:nil]; + } + } + else { + if ([_fileManager createFileWithData:objectData filePath:[self objectName:object] permisson:@(0755)]) { + return object; + } + else { + return [NSError errorWithDomain:NSLocalizedString(@"Object cannot be created", @"") code:kHTTPStatusCodeBadRequest userInfo:nil]; + } + } + } + else { + if ([self issetPNObjectModelForObject:object]) { + + NSData * data = [_fileManager fetchFileDataWithPath:[self objectName:object]]; + + NSMutableArray *objects = [[NSMutableArray alloc] initWithArray:[NSKeyedUnarchiver unarchiveObjectWithData:data]]; + + + SEL selector = NSSelectorFromString(@"getJSONObject"); + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[[PNObject class] instanceMethodSignatureForSelector:selector]]; + [invocation setSelector:selector]; + [invocation setTarget:object]; + [invocation invoke]; + + NSDictionary *objectDict; + [invocation getReturnValue:&objectDict]; + + NSLogDebug(@"%@",objectDict); + + [objects addObject:objectDict]; + + NSData *objectData = [NSKeyedArchiver archivedDataWithRootObject:objects]; + + if ([_fileManager updateFileWithData:objectData filePath:[self objectName:object] permisson:@(0755)]) { + + return objects; + } + else { + return [NSError errorWithDomain:NSLocalizedString(@"Objects list cannot be updated", @"") code:kHTTPStatusCodeBadRequest userInfo:nil]; + } + } + else { + + NSMutableArray *objects = [[NSMutableArray alloc] init]; + + + SEL selector = NSSelectorFromString(@"getJSONObject"); + NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[[PNObject class] instanceMethodSignatureForSelector:selector]]; + [invocation setSelector:selector]; + [invocation setTarget:object]; + [invocation invoke]; + + NSDictionary *objectDict; + [invocation getReturnValue:&objectDict]; + + NSLogDebug(@"%@",objectDict); + + [objects addObject:objectDict]; + + NSData *objectData = [NSKeyedArchiver archivedDataWithRootObject:objects]; + + if ([_fileManager createFileWithData:objectData filePath:[self objectName:object] permisson:@(0755)]) { + return object; + } + else { + return [NSError errorWithDomain:NSLocalizedString(@"Objects list cannot be created", @"") code:kHTTPStatusCodeBadRequest userInfo:nil]; + } + } + } + } + else { + return [NSError errorWithDomain:NSLocalizedString(@"passed object is not conform to protocol PNObjectSubclassing", @"") code:kHTTPStatusCodeBadRequest userInfo:nil]; + } + } + else { + return [NSError errorWithDomain:NSLocalizedString(@"passed object is not PNObject Subclass", @"") code:kHTTPStatusCodeBadRequest userInfo:nil]; + } +} + +- (id _Nonnull) saveNSUSerDefautls:(id _Nonnull) object { + } - (BOOL) removeObjectLocally:(id _Nonnull) object { - BOOL isPNObjectSubclass = [[object class] isSubclassOfClass:[PNObject class]]; - - if(isPNObjectSubclass) { - - if ([[object class] conformsToProtocol:@protocol(PNObjectSubclassing)]) { - - if ([self issetPNObjectModelForObject:object]) { - return [_fileManager deletePath:[self objectName:object]]; - } - } - } - return NO; + BOOL isPNObjectSubclass = [[object class] isSubclassOfClass:[PNObject class]]; + + if(isPNObjectSubclass) { + + if ([[object class] conformsToProtocol:@protocol(PNObjectSubclassing)]) { + + if ([self issetPNObjectModelForObject:object]) { + return [_fileManager deletePath:[self objectName:object]]; + } + } + } + return NO; } @end diff --git a/Pod/Classes/PNObjectProperty.h b/Pod/Classes/PNObjectProperty.h deleted file mode 100755 index 94a7de5..0000000 --- a/Pod/Classes/PNObjectProperty.h +++ /dev/null @@ -1,16 +0,0 @@ -// -// PNObjectProperty.h -// Pods -// -// Created by Giuseppe Nucifora on 28/12/15. -// -// - -#import -#import "PNObject.h" - -@interface PNObjectProperty : NSObject - -+ (NSDictionary *)propertiesForClass:(Class)PNObjClass; - -@end diff --git a/Pod/Classes/PNObjectProperty.m b/Pod/Classes/PNObjectProperty.m deleted file mode 100755 index f931c60..0000000 --- a/Pod/Classes/PNObjectProperty.m +++ /dev/null @@ -1,84 +0,0 @@ -// -// PNObjectProperty.m -// Pods -// -// Created by Giuseppe Nucifora on 28/12/15. -// -// - -#import "PNObjectProperty.h" -#import "objc/runtime.h" -#import "PNObjectConstants.h" -#import "PNObject+Protected.h" - -@implementation PNObjectProperty - -static BOOL property_getTypeString( objc_property_t property, char *buffer ) -{ - const char * attrs = property_getAttributes( property ); - if ( attrs == NULL ) - return NO; - - const char * e = strchr( attrs, ',' ); - if ( e == NULL ) - return NO; - - int len = (int)(e - attrs); - memcpy( buffer, attrs, len ); - buffer[len] = '\0'; - - return YES; -} - - - -+ (NSDictionary *)propertiesForClass:(Class)PNObjClass -{ - if (PNObjClass == NULL) { - return nil; - } - - NSMutableDictionary *results = [NSMutableDictionary dictionary]; - if ([PNObjClass isSubclassOfClass:[PNObject class]] && PNObjClass != [PNObject class]) { - [results addEntriesFromDictionary:[self propertiesForClass:[PNObject class]]]; - } - - unsigned int outCount, i; - objc_property_t *properties = class_copyPropertyList(PNObjClass, &outCount); - for (i = 0; i < outCount; i++) { - objc_property_t property = properties[i]; - const char *propName = property_getName(property); - if(propName) { - //const char *propType = getPropertyType(property); - char propType[256]; - if (!property_getTypeString(property, propType)) { - continue; - } - NSString *propertyName = [NSString stringWithUTF8String:propName]; - NSString *propertyType = [NSString stringWithUTF8String:propType]; - - NSRange range = [propertyType rangeOfString:@"T@\""]; - NSRange range2 = [propertyType rangeOfString:@"T"]; - if (range.location != NSNotFound) { - NSRange subStrRange = NSMakeRange(range.length, propertyType.length - (range.length + 1)); - propertyType = [propertyType substringWithRange:subStrRange]; - } - else if (range2.location != NSNotFound) { - NSRange subStrRange = NSMakeRange(range2.length, propertyType.length - (range2.length)); - propertyType = [propertyType substringWithRange:subStrRange]; - } - - //NSLogDebug(@"Prop type & name: %@ -- %@", propertyType, propertyName); - - if (![[PNObject protectedProperties] containsObject:propertyName]) { - [results setObject:propertyType forKey:propertyName]; - } - } - } - free(properties); - - // returning a copy here to make sure the dictionary is immutable - return [NSDictionary dictionaryWithDictionary:results]; -} - -@end diff --git a/Pod/Classes/User/PNAddress.h b/Pod/Classes/User/PNAddress.h deleted file mode 100644 index ad8207e..0000000 --- a/Pod/Classes/User/PNAddress.h +++ /dev/null @@ -1,23 +0,0 @@ -// -// PNAddress.h -// Pods -// -// Created by Giuseppe Nucifora on 13/01/16. -// -// - -#import "PNObject.h" -#import "PNLocation.h" - -@interface PNAddress : PNObject - -@property (nonatomic, strong) NSString * _Nullable country; -@property (nonatomic, strong) NSString * _Nullable province; -@property (nonatomic, strong) NSString * _Nullable city; -@property (nonatomic, strong) NSString * _Nullable street; -@property (nonatomic, strong) NSNumber * _Nullable number; -@property (nonatomic, strong) NSString * _Nullable zip; -@property (nonatomic, strong) NSString * _Nullable istruction; -@property (nonatomic, strong) PNLocation * _Nullable location; - -@end diff --git a/Pod/Classes/User/PNUser.h b/Pod/Classes/User/PNUser.h deleted file mode 100644 index 775f469..0000000 --- a/Pod/Classes/User/PNUser.h +++ /dev/null @@ -1,45 +0,0 @@ -// -// PNUser.h -// Pods -// -// Created by Giuseppe Nucifora on 15/01/16. -// -// - -#import "PNObject.h" - - -@interface PNUser : PNObject - -@property (strong, nonatomic) NSString * _Nonnull userId; -@property (strong, nonatomic) NSString * _Nonnull firstName; -@property (strong, nonatomic) NSString * _Nonnull lastName; -@property (nonatomic, strong) UIImage * _Nullable profileImage; -@property (nonatomic, strong) NSString * _Nullable sex; -@property (nonatomic, strong) NSDate * _Nullable birthDate; -@property (nonatomic, strong) NSString * _Nullable phone; -@property (nonatomic) BOOL hasAcceptedPrivacy; -@property (nonatomic) BOOL hasAcceptedNewsletter; -@property (nonatomic) BOOL hasVerifiedEmail; -@property (nonatomic, strong) NSDate * _Nullable emailVerifiedDate; -@property (nonatomic, strong) NSString * _Nonnull email; -@property (nonatomic, strong) NSString * _Nonnull username; -@property (nonatomic, strong) NSString * _Nonnull password; -@property (nonatomic) BOOL publicProfile; -@property (nonatomic, strong) NSNumber * _Nonnull loginCount; -@property (nonatomic, strong) NSString * _Nullable facebookId; -@property (nonatomic, strong) NSString * _Nullable facebookAccessToken; - - -/** - * gets singleton object of current user session. - * - * @return singleton - */ -+ (instancetype _Nonnull) currentUser; - -- (BOOL) isValidPassword:(NSString* _Nonnull) password; - -//- (void) setPassword:(NSString * _Nonnull)password inBackGroundWithBlock:(nullable void (^)(BOOL saveStatus, id _Nullable responseObject, NSError * _Nullable error)) responseBlock; - -@end diff --git a/Pod/Classes/User/PNUser.m b/Pod/Classes/User/PNUser.m deleted file mode 100644 index f493573..0000000 --- a/Pod/Classes/User/PNUser.m +++ /dev/null @@ -1,161 +0,0 @@ -// -// PNUser.m -// Pods -// -// Created by Giuseppe Nucifora on 15/01/16. -// -// - -#import "PNUser.h" -#import "NSString+Helper.h" -#import "PNObjectConstants.h" -#import "PNObject+Protected.h" - - -@interface PNUser() - -@end - -@implementation PNUser - -@synthesize password = _password; - -static PNUser *SINGLETON = nil; - -static bool isFirstAccess = YES; - -#pragma mark - Public Method - -+ (instancetype)sharedInstance -{ - return [self currentUser]; -} - -+ (instancetype) currentUser { - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - isFirstAccess = NO; - - SINGLETON = [[super allocWithZone:NULL] init]; - }); - - return SINGLETON; -} - -#pragma mark - Life Cycle - -+ (instancetype) allocWithZone:(NSZone *)zone -{ - return [self sharedInstance]; -} - -+ (instancetype)copyWithZone:(struct _NSZone *)zone -{ - return [self sharedInstance]; -} - -+ (instancetype)mutableCopyWithZone:(struct _NSZone *)zone -{ - return [self sharedInstance]; -} - -- (instancetype)copy -{ - return [[PNUser alloc] init]; -} - -- (instancetype)mutableCopy -{ - return [[PNUser alloc] init]; -} - -- (id) init -{ - if(SINGLETON){ - return SINGLETON; - } - if (isFirstAccess) { - [self doesNotRecognizeSelector:_cmd]; - } - - NSDictionary *savedUser = [[PNObjectModel sharedInstance] fetchObjectsWithClass:[self class]]; - - if (savedUser) { - self = [super initWithJSON:savedUser]; - } - else { - self = [super init]; - } - - if (self) { - } - return self; -} - -- (void) setEmail:(NSString *)email { - if ([email isValidEmail]) { - _email = email; - } - NSLogDebug(@"insertedEmail is not valid."); -} - -- (void) setPassword:(NSString *)password { - if ([password length] >= [[PNObjectConfig sharedInstance] minPasswordLenght]) { - _password = password; - } - else { - NSLogDebug(@"Inserted Passord is not valid.Lenght must be >= %ld",(long)[[PNObjectConfig sharedInstance] minPasswordLenght]); - } -} - -- (BOOL) isValidPassword:(NSString* _Nonnull) password { - if ([password length] >= [[PNObjectConfig sharedInstance] minPasswordLenght]) { - return YES; - } - return NO; -} - - -- (NSString *) password { - return @"password is not readble"; -} - -#pragma mark PNObjectSubclassing Protocol - -+ (NSDictionary *)objcetMapping { - - NSDictionary *mapping = @{ - @"userId":@"id", - @"firstName":@"firstName", - @"lastName":@"lastName", - @"profileImage":@"profileImage", - @"sex":@"sex", - @"birthDate":@"birthDate", - @"phone":@"phone", - @"password":@"password", - @"hasAcceptedPrivacy":@"hasAcceptedPrivacy", - @"hasAcceptedNewsletter":@"hasAcceptedNewsletter", - @"hasVerifiedEmail":@"hasVerifiedEmail", - @"emailVerifiedDate":@"emailVerifiedDate", - @"email":@"email", - @"username":@"username", - @"publicProfile":@"public_profile", - @"loginCount":@"login_count", - @"facebookId":@"facebookId", - @"facebookAccessToken":@"facebookAccessToken", - }; - return mapping; -} - -+ (NSString *)objectClassName { - return @"User"; -} - -+ (BOOL) singleInstance { - return YES; -} - -#pragma mark - - - -@end