ceshi
Showing
62 changed files
with
3772 additions
and
20 deletions
| ... | @@ -208,7 +208,7 @@ | ... | @@ -208,7 +208,7 @@ |
| 208 | 6003F586195388D20070C39A /* Sources */, | 208 | 6003F586195388D20070C39A /* Sources */, |
| 209 | 6003F587195388D20070C39A /* Frameworks */, | 209 | 6003F587195388D20070C39A /* Frameworks */, |
| 210 | 6003F588195388D20070C39A /* Resources */, | 210 | 6003F588195388D20070C39A /* Resources */, |
| 211 | D64742FE184E91E0FBAA866F /* [CP] Embed Pods Frameworks */, | 211 | 5ABB5B4107E1A8D5114A0BE8 /* [CP] Embed Pods Frameworks */, |
| 212 | ); | 212 | ); |
| 213 | buildRules = ( | 213 | buildRules = ( |
| 214 | ); | 214 | ); |
| ... | @@ -318,44 +318,44 @@ | ... | @@ -318,44 +318,44 @@ |
| 318 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; | 318 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; |
| 319 | showEnvVarsInLog = 0; | 319 | showEnvVarsInLog = 0; |
| 320 | }; | 320 | }; |
| 321 | A3A9A2FA91267A67620EFAA0 /* [CP] Check Pods Manifest.lock */ = { | 321 | 5ABB5B4107E1A8D5114A0BE8 /* [CP] Embed Pods Frameworks */ = { |
| 322 | isa = PBXShellScriptBuildPhase; | 322 | isa = PBXShellScriptBuildPhase; |
| 323 | buildActionMask = 2147483647; | 323 | buildActionMask = 2147483647; |
| 324 | files = ( | 324 | files = ( |
| 325 | ); | 325 | ); |
| 326 | inputFileListPaths = ( | ||
| 327 | ); | ||
| 328 | inputPaths = ( | 326 | inputPaths = ( |
| 329 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", | 327 | "${PODS_ROOT}/Target Support Files/Pods-JCategoryKit_Example/Pods-JCategoryKit_Example-frameworks.sh", |
| 330 | "${PODS_ROOT}/Manifest.lock", | 328 | "${BUILT_PRODUCTS_DIR}/JCategoryKit/JCategoryKit.framework", |
| 331 | ); | ||
| 332 | name = "[CP] Check Pods Manifest.lock"; | ||
| 333 | outputFileListPaths = ( | ||
| 334 | ); | 329 | ); |
| 330 | name = "[CP] Embed Pods Frameworks"; | ||
| 335 | outputPaths = ( | 331 | outputPaths = ( |
| 336 | "$(DERIVED_FILE_DIR)/Pods-JCategoryKit_Example-checkManifestLockResult.txt", | 332 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JCategoryKit.framework", |
| 337 | ); | 333 | ); |
| 338 | runOnlyForDeploymentPostprocessing = 0; | 334 | runOnlyForDeploymentPostprocessing = 0; |
| 339 | shellPath = /bin/sh; | 335 | shellPath = /bin/sh; |
| 340 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; | 336 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-JCategoryKit_Example/Pods-JCategoryKit_Example-frameworks.sh\"\n"; |
| 341 | showEnvVarsInLog = 0; | 337 | showEnvVarsInLog = 0; |
| 342 | }; | 338 | }; |
| 343 | D64742FE184E91E0FBAA866F /* [CP] Embed Pods Frameworks */ = { | 339 | A3A9A2FA91267A67620EFAA0 /* [CP] Check Pods Manifest.lock */ = { |
| 344 | isa = PBXShellScriptBuildPhase; | 340 | isa = PBXShellScriptBuildPhase; |
| 345 | buildActionMask = 2147483647; | 341 | buildActionMask = 2147483647; |
| 346 | files = ( | 342 | files = ( |
| 347 | ); | 343 | ); |
| 344 | inputFileListPaths = ( | ||
| 345 | ); | ||
| 348 | inputPaths = ( | 346 | inputPaths = ( |
| 349 | "${PODS_ROOT}/Target Support Files/Pods-JCategoryKit_Example/Pods-JCategoryKit_Example-frameworks.sh", | 347 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", |
| 350 | "${BUILT_PRODUCTS_DIR}/JCategoryKit/JCategoryKit.framework", | 348 | "${PODS_ROOT}/Manifest.lock", |
| 349 | ); | ||
| 350 | name = "[CP] Check Pods Manifest.lock"; | ||
| 351 | outputFileListPaths = ( | ||
| 351 | ); | 352 | ); |
| 352 | name = "[CP] Embed Pods Frameworks"; | ||
| 353 | outputPaths = ( | 353 | outputPaths = ( |
| 354 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/JCategoryKit.framework", | 354 | "$(DERIVED_FILE_DIR)/Pods-JCategoryKit_Example-checkManifestLockResult.txt", |
| 355 | ); | 355 | ); |
| 356 | runOnlyForDeploymentPostprocessing = 0; | 356 | runOnlyForDeploymentPostprocessing = 0; |
| 357 | shellPath = /bin/sh; | 357 | shellPath = /bin/sh; |
| 358 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-JCategoryKit_Example/Pods-JCategoryKit_Example-frameworks.sh\"\n"; | 358 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; |
| 359 | showEnvVarsInLog = 0; | 359 | showEnvVarsInLog = 0; |
| 360 | }; | 360 | }; |
| 361 | E7B9F2BB3382B44E49A9CEEE /* [CP] Embed Pods Frameworks */ = { | 361 | E7B9F2BB3382B44E49A9CEEE /* [CP] Embed Pods Frameworks */ = { | ... | ... |
| ... | @@ -7,6 +7,7 @@ | ... | @@ -7,6 +7,7 @@ |
| 7 | // | 7 | // |
| 8 | 8 | ||
| 9 | #import "STViewController.h" | 9 | #import "STViewController.h" |
| 10 | #import <Person.h> | ||
| 10 | 11 | ||
| 11 | @interface STViewController () | 12 | @interface STViewController () |
| 12 | 13 | ||
| ... | @@ -17,7 +18,8 @@ | ... | @@ -17,7 +18,8 @@ |
| 17 | - (void)viewDidLoad | 18 | - (void)viewDidLoad |
| 18 | { | 19 | { |
| 19 | [super viewDidLoad]; | 20 | [super viewDidLoad]; |
| 20 | // Do any additional setup after loading the view, typically from a nib. | 21 | Person *p = [[Person alloc] init]; |
| 22 | [p eat]; | ||
| 21 | } | 23 | } |
| 22 | 24 | ||
| 23 | - (void)didReceiveMemoryWarning | 25 | - (void)didReceiveMemoryWarning | ... | ... |
Example/Podfile.lock
0 → 100644
| 1 | PODS: | ||
| 2 | - FBSnapshotTestCase (2.1.4): | ||
| 3 | - FBSnapshotTestCase/SwiftSupport (= 2.1.4) | ||
| 4 | - FBSnapshotTestCase/Core (2.1.4) | ||
| 5 | - FBSnapshotTestCase/SwiftSupport (2.1.4): | ||
| 6 | - FBSnapshotTestCase/Core | ||
| 7 | - JCategoryKit (1.0.0) | ||
| 8 | |||
| 9 | DEPENDENCIES: | ||
| 10 | - FBSnapshotTestCase | ||
| 11 | - JCategoryKit (from `../`) | ||
| 12 | |||
| 13 | SPEC REPOS: | ||
| 14 | trunk: | ||
| 15 | - FBSnapshotTestCase | ||
| 16 | |||
| 17 | EXTERNAL SOURCES: | ||
| 18 | JCategoryKit: | ||
| 19 | :path: "../" | ||
| 20 | |||
| 21 | SPEC CHECKSUMS: | ||
| 22 | FBSnapshotTestCase: 094f9f314decbabe373b87cc339bea235a63e07a | ||
| 23 | JCategoryKit: 1ee089cd5593b2515c06f8b99e9eb02fdac4eecd | ||
| 24 | |||
| 25 | PODFILE CHECKSUM: 7301f47448ac58a307221e0e73e2a910d76a70ab | ||
| 26 | |||
| 27 | COCOAPODS: 1.11.2 |
Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIApplication+StrictKeyWindow.h
0 → 100644
| 1 | /* | ||
| 2 | * Copyright (c) 2015, Facebook, Inc. | ||
| 3 | * All rights reserved. | ||
| 4 | * | ||
| 5 | * This source code is licensed under the BSD-style license found in the | ||
| 6 | * LICENSE file in the root directory of this source tree. An additional grant | ||
| 7 | * of patent rights can be found in the PATENTS file in the same directory. | ||
| 8 | * | ||
| 9 | */ | ||
| 10 | |||
| 11 | #import <UIKit/UIKit.h> | ||
| 12 | |||
| 13 | @interface UIApplication (StrictKeyWindow) | ||
| 14 | |||
| 15 | /** | ||
| 16 | @return The receiver's @c keyWindow. Raises an assertion if @c nil. | ||
| 17 | */ | ||
| 18 | - (UIWindow *)fb_strictKeyWindow; | ||
| 19 | |||
| 20 | @end |
Example/Pods/FBSnapshotTestCase/FBSnapshotTestCase/Categories/UIApplication+StrictKeyWindow.m
0 → 100644
| 1 | /* | ||
| 2 | * Copyright (c) 2015, Facebook, Inc. | ||
| 3 | * All rights reserved. | ||
| 4 | * | ||
| 5 | * This source code is licensed under the BSD-style license found in the | ||
| 6 | * LICENSE file in the root directory of this source tree. An additional grant | ||
| 7 | * of patent rights can be found in the PATENTS file in the same directory. | ||
| 8 | * | ||
| 9 | */ | ||
| 10 | |||
| 11 | #import <FBSnapshotTestCase/UIApplication+StrictKeyWindow.h> | ||
| 12 | |||
| 13 | @implementation UIApplication (StrictKeyWindow) | ||
| 14 | |||
| 15 | - (UIWindow *)fb_strictKeyWindow | ||
| 16 | { | ||
| 17 | UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow; | ||
| 18 | if (!keyWindow) { | ||
| 19 | [NSException raise:@"FBSnapshotTestCaseNilKeyWindowException" | ||
| 20 | format:@"Snapshot tests must be hosted by an application with a key window. Please ensure your test" | ||
| 21 | " host sets up a key window at launch (either via storyboards or programmatically) and doesn't" | ||
| 22 | " do anything to remove it while snapshot tests are running."]; | ||
| 23 | } | ||
| 24 | return keyWindow; | ||
| 25 | } | ||
| 26 | |||
| 27 | @end |
| 1 | // | ||
| 2 | // Created by Gabriel Handford on 3/1/09. | ||
| 3 | // Copyright 2009-2013. All rights reserved. | ||
| 4 | // Created by John Boiles on 10/20/11. | ||
| 5 | // Copyright (c) 2011. All rights reserved | ||
| 6 | // Modified by Felix Schulze on 2/11/13. | ||
| 7 | // Copyright 2013. All rights reserved. | ||
| 8 | // | ||
| 9 | // Permission is hereby granted, free of charge, to any person | ||
| 10 | // obtaining a copy of this software and associated documentation | ||
| 11 | // files (the "Software"), to deal in the Software without | ||
| 12 | // restriction, including without limitation the rights to use, | ||
| 13 | // copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
| 14 | // copies of the Software, and to permit persons to whom the | ||
| 15 | // Software is furnished to do so, subject to the following | ||
| 16 | // conditions: | ||
| 17 | // | ||
| 18 | // The above copyright notice and this permission notice shall be | ||
| 19 | // included in all copies or substantial portions of the Software. | ||
| 20 | // | ||
| 21 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
| 22 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES | ||
| 23 | // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||
| 24 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | ||
| 25 | // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | ||
| 26 | // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
| 27 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 28 | // OTHER DEALINGS IN THE SOFTWARE. | ||
| 29 | // | ||
| 30 | |||
| 31 | #import <UIKit/UIKit.h> | ||
| 32 | |||
| 33 | @interface UIImage (Compare) | ||
| 34 | |||
| 35 | - (BOOL)fb_compareWithImage:(UIImage *)image tolerance:(CGFloat)tolerance; | ||
| 36 | |||
| 37 | @end |
| 1 | // | ||
| 2 | // Created by Gabriel Handford on 3/1/09. | ||
| 3 | // Copyright 2009-2013. All rights reserved. | ||
| 4 | // Created by John Boiles on 10/20/11. | ||
| 5 | // Copyright (c) 2011. All rights reserved | ||
| 6 | // Modified by Felix Schulze on 2/11/13. | ||
| 7 | // Copyright 2013. All rights reserved. | ||
| 8 | // | ||
| 9 | // Permission is hereby granted, free of charge, to any person | ||
| 10 | // obtaining a copy of this software and associated documentation | ||
| 11 | // files (the "Software"), to deal in the Software without | ||
| 12 | // restriction, including without limitation the rights to use, | ||
| 13 | // copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
| 14 | // copies of the Software, and to permit persons to whom the | ||
| 15 | // Software is furnished to do so, subject to the following | ||
| 16 | // conditions: | ||
| 17 | // | ||
| 18 | // The above copyright notice and this permission notice shall be | ||
| 19 | // included in all copies or substantial portions of the Software. | ||
| 20 | // | ||
| 21 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
| 22 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES | ||
| 23 | // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||
| 24 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | ||
| 25 | // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | ||
| 26 | // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
| 27 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 28 | // OTHER DEALINGS IN THE SOFTWARE. | ||
| 29 | // | ||
| 30 | |||
| 31 | #import <FBSnapshotTestCase/UIImage+Compare.h> | ||
| 32 | |||
| 33 | // This makes debugging much more fun | ||
| 34 | typedef union { | ||
| 35 | uint32_t raw; | ||
| 36 | unsigned char bytes[4]; | ||
| 37 | struct { | ||
| 38 | char red; | ||
| 39 | char green; | ||
| 40 | char blue; | ||
| 41 | char alpha; | ||
| 42 | } __attribute__ ((packed)) pixels; | ||
| 43 | } FBComparePixel; | ||
| 44 | |||
| 45 | @implementation UIImage (Compare) | ||
| 46 | |||
| 47 | - (BOOL)fb_compareWithImage:(UIImage *)image tolerance:(CGFloat)tolerance | ||
| 48 | { | ||
| 49 | NSAssert(CGSizeEqualToSize(self.size, image.size), @"Images must be same size."); | ||
| 50 | |||
| 51 | CGSize referenceImageSize = CGSizeMake(CGImageGetWidth(self.CGImage), CGImageGetHeight(self.CGImage)); | ||
| 52 | CGSize imageSize = CGSizeMake(CGImageGetWidth(image.CGImage), CGImageGetHeight(image.CGImage)); | ||
| 53 | |||
| 54 | // The images have the equal size, so we could use the smallest amount of bytes because of byte padding | ||
| 55 | size_t minBytesPerRow = MIN(CGImageGetBytesPerRow(self.CGImage), CGImageGetBytesPerRow(image.CGImage)); | ||
| 56 | size_t referenceImageSizeBytes = referenceImageSize.height * minBytesPerRow; | ||
| 57 | void *referenceImagePixels = calloc(1, referenceImageSizeBytes); | ||
| 58 | void *imagePixels = calloc(1, referenceImageSizeBytes); | ||
| 59 | |||
| 60 | if (!referenceImagePixels || !imagePixels) { | ||
| 61 | free(referenceImagePixels); | ||
| 62 | free(imagePixels); | ||
| 63 | return NO; | ||
| 64 | } | ||
| 65 | |||
| 66 | CGContextRef referenceImageContext = CGBitmapContextCreate(referenceImagePixels, | ||
| 67 | referenceImageSize.width, | ||
| 68 | referenceImageSize.height, | ||
| 69 | CGImageGetBitsPerComponent(self.CGImage), | ||
| 70 | minBytesPerRow, | ||
| 71 | CGImageGetColorSpace(self.CGImage), | ||
| 72 | (CGBitmapInfo)kCGImageAlphaPremultipliedLast | ||
| 73 | ); | ||
| 74 | CGContextRef imageContext = CGBitmapContextCreate(imagePixels, | ||
| 75 | imageSize.width, | ||
| 76 | imageSize.height, | ||
| 77 | CGImageGetBitsPerComponent(image.CGImage), | ||
| 78 | minBytesPerRow, | ||
| 79 | CGImageGetColorSpace(image.CGImage), | ||
| 80 | (CGBitmapInfo)kCGImageAlphaPremultipliedLast | ||
| 81 | ); | ||
| 82 | |||
| 83 | if (!referenceImageContext || !imageContext) { | ||
| 84 | CGContextRelease(referenceImageContext); | ||
| 85 | CGContextRelease(imageContext); | ||
| 86 | free(referenceImagePixels); | ||
| 87 | free(imagePixels); | ||
| 88 | return NO; | ||
| 89 | } | ||
| 90 | |||
| 91 | CGContextDrawImage(referenceImageContext, CGRectMake(0, 0, referenceImageSize.width, referenceImageSize.height), self.CGImage); | ||
| 92 | CGContextDrawImage(imageContext, CGRectMake(0, 0, imageSize.width, imageSize.height), image.CGImage); | ||
| 93 | |||
| 94 | CGContextRelease(referenceImageContext); | ||
| 95 | CGContextRelease(imageContext); | ||
| 96 | |||
| 97 | BOOL imageEqual = YES; | ||
| 98 | |||
| 99 | // Do a fast compare if we can | ||
| 100 | if (tolerance == 0) { | ||
| 101 | imageEqual = (memcmp(referenceImagePixels, imagePixels, referenceImageSizeBytes) == 0); | ||
| 102 | } else { | ||
| 103 | // Go through each pixel in turn and see if it is different | ||
| 104 | const NSInteger pixelCount = referenceImageSize.width * referenceImageSize.height; | ||
| 105 | |||
| 106 | FBComparePixel *p1 = referenceImagePixels; | ||
| 107 | FBComparePixel *p2 = imagePixels; | ||
| 108 | |||
| 109 | NSInteger numDiffPixels = 0; | ||
| 110 | for (int n = 0; n < pixelCount; ++n) { | ||
| 111 | // If this pixel is different, increment the pixel diff count and see | ||
| 112 | // if we have hit our limit. | ||
| 113 | if (p1->raw != p2->raw) { | ||
| 114 | numDiffPixels ++; | ||
| 115 | |||
| 116 | CGFloat percent = (CGFloat)numDiffPixels / pixelCount; | ||
| 117 | if (percent > tolerance) { | ||
| 118 | imageEqual = NO; | ||
| 119 | break; | ||
| 120 | } | ||
| 121 | } | ||
| 122 | |||
| 123 | p1++; | ||
| 124 | p2++; | ||
| 125 | } | ||
| 126 | } | ||
| 127 | |||
| 128 | free(referenceImagePixels); | ||
| 129 | free(imagePixels); | ||
| 130 | |||
| 131 | return imageEqual; | ||
| 132 | } | ||
| 133 | |||
| 134 | @end |
| 1 | // | ||
| 2 | // Created by Gabriel Handford on 3/1/09. | ||
| 3 | // Copyright 2009-2013. All rights reserved. | ||
| 4 | // Created by John Boiles on 10/20/11. | ||
| 5 | // Copyright (c) 2011. All rights reserved | ||
| 6 | // Modified by Felix Schulze on 2/11/13. | ||
| 7 | // Copyright 2013. All rights reserved. | ||
| 8 | // | ||
| 9 | // Permission is hereby granted, free of charge, to any person | ||
| 10 | // obtaining a copy of this software and associated documentation | ||
| 11 | // files (the "Software"), to deal in the Software without | ||
| 12 | // restriction, including without limitation the rights to use, | ||
| 13 | // copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
| 14 | // copies of the Software, and to permit persons to whom the | ||
| 15 | // Software is furnished to do so, subject to the following | ||
| 16 | // conditions: | ||
| 17 | // | ||
| 18 | // The above copyright notice and this permission notice shall be | ||
| 19 | // included in all copies or substantial portions of the Software. | ||
| 20 | // | ||
| 21 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
| 22 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES | ||
| 23 | // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||
| 24 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | ||
| 25 | // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | ||
| 26 | // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
| 27 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 28 | // OTHER DEALINGS IN THE SOFTWARE. | ||
| 29 | // | ||
| 30 | |||
| 31 | #import <UIKit/UIKit.h> | ||
| 32 | |||
| 33 | @interface UIImage (Diff) | ||
| 34 | |||
| 35 | - (UIImage *)fb_diffWithImage:(UIImage *)image; | ||
| 36 | |||
| 37 | @end |
| 1 | // | ||
| 2 | // Created by Gabriel Handford on 3/1/09. | ||
| 3 | // Copyright 2009-2013. All rights reserved. | ||
| 4 | // Created by John Boiles on 10/20/11. | ||
| 5 | // Copyright (c) 2011. All rights reserved | ||
| 6 | // Modified by Felix Schulze on 2/11/13. | ||
| 7 | // Copyright 2013. All rights reserved. | ||
| 8 | // | ||
| 9 | // Permission is hereby granted, free of charge, to any person | ||
| 10 | // obtaining a copy of this software and associated documentation | ||
| 11 | // files (the "Software"), to deal in the Software without | ||
| 12 | // restriction, including without limitation the rights to use, | ||
| 13 | // copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
| 14 | // copies of the Software, and to permit persons to whom the | ||
| 15 | // Software is furnished to do so, subject to the following | ||
| 16 | // conditions: | ||
| 17 | // | ||
| 18 | // The above copyright notice and this permission notice shall be | ||
| 19 | // included in all copies or substantial portions of the Software. | ||
| 20 | // | ||
| 21 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
| 22 | // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES | ||
| 23 | // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||
| 24 | // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | ||
| 25 | // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | ||
| 26 | // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
| 27 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 28 | // OTHER DEALINGS IN THE SOFTWARE. | ||
| 29 | // | ||
| 30 | |||
| 31 | #import <FBSnapshotTestCase/UIImage+Diff.h> | ||
| 32 | |||
| 33 | @implementation UIImage (Diff) | ||
| 34 | |||
| 35 | - (UIImage *)fb_diffWithImage:(UIImage *)image | ||
| 36 | { | ||
| 37 | if (!image) { | ||
| 38 | return nil; | ||
| 39 | } | ||
| 40 | CGSize imageSize = CGSizeMake(MAX(self.size.width, image.size.width), MAX(self.size.height, image.size.height)); | ||
| 41 | UIGraphicsBeginImageContextWithOptions(imageSize, YES, 0); | ||
| 42 | CGContextRef context = UIGraphicsGetCurrentContext(); | ||
| 43 | [self drawInRect:CGRectMake(0, 0, self.size.width, self.size.height)]; | ||
| 44 | CGContextSetAlpha(context, 0.5); | ||
| 45 | CGContextBeginTransparencyLayer(context, NULL); | ||
| 46 | [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)]; | ||
| 47 | CGContextSetBlendMode(context, kCGBlendModeDifference); | ||
| 48 | CGContextSetFillColorWithColor(context,[UIColor whiteColor].CGColor); | ||
| 49 | CGContextFillRect(context, CGRectMake(0, 0, self.size.width, self.size.height)); | ||
| 50 | CGContextEndTransparencyLayer(context); | ||
| 51 | UIImage *returnImage = UIGraphicsGetImageFromCurrentImageContext(); | ||
| 52 | UIGraphicsEndImageContext(); | ||
| 53 | return returnImage; | ||
| 54 | } | ||
| 55 | |||
| 56 | @end |
| 1 | /* | ||
| 2 | * Copyright (c) 2015, Facebook, Inc. | ||
| 3 | * All rights reserved. | ||
| 4 | * | ||
| 5 | * This source code is licensed under the BSD-style license found in the | ||
| 6 | * LICENSE file in the root directory of this source tree. An additional grant | ||
| 7 | * of patent rights can be found in the PATENTS file in the same directory. | ||
| 8 | * | ||
| 9 | */ | ||
| 10 | |||
| 11 | #import <UIKit/UIKit.h> | ||
| 12 | |||
| 13 | @interface UIImage (Snapshot) | ||
| 14 | |||
| 15 | /// Uses renderInContext: to get a snapshot of the layer. | ||
| 16 | + (UIImage *)fb_imageForLayer:(CALayer *)layer; | ||
| 17 | |||
| 18 | /// Uses renderInContext: to get a snapshot of the view layer. | ||
| 19 | + (UIImage *)fb_imageForViewLayer:(UIView *)view; | ||
| 20 | |||
| 21 | /// Uses drawViewHierarchyInRect: to get a snapshot of the view and adds the view into a window if needed. | ||
| 22 | + (UIImage *)fb_imageForView:(UIView *)view; | ||
| 23 | |||
| 24 | @end |
| 1 | /* | ||
| 2 | * Copyright (c) 2015, Facebook, Inc. | ||
| 3 | * All rights reserved. | ||
| 4 | * | ||
| 5 | * This source code is licensed under the BSD-style license found in the | ||
| 6 | * LICENSE file in the root directory of this source tree. An additional grant | ||
| 7 | * of patent rights can be found in the PATENTS file in the same directory. | ||
| 8 | * | ||
| 9 | */ | ||
| 10 | |||
| 11 | #import <FBSnapshotTestCase/UIImage+Snapshot.h> | ||
| 12 | #import <FBSnapshotTestCase/UIApplication+StrictKeyWindow.h> | ||
| 13 | |||
| 14 | @implementation UIImage (Snapshot) | ||
| 15 | |||
| 16 | + (UIImage *)fb_imageForLayer:(CALayer *)layer | ||
| 17 | { | ||
| 18 | CGRect bounds = layer.bounds; | ||
| 19 | NSAssert1(CGRectGetWidth(bounds), @"Zero width for layer %@", layer); | ||
| 20 | NSAssert1(CGRectGetHeight(bounds), @"Zero height for layer %@", layer); | ||
| 21 | |||
| 22 | UIGraphicsBeginImageContextWithOptions(bounds.size, NO, 0); | ||
| 23 | CGContextRef context = UIGraphicsGetCurrentContext(); | ||
| 24 | NSAssert1(context, @"Could not generate context for layer %@", layer); | ||
| 25 | CGContextSaveGState(context); | ||
| 26 | [layer layoutIfNeeded]; | ||
| 27 | [layer renderInContext:context]; | ||
| 28 | CGContextRestoreGState(context); | ||
| 29 | |||
| 30 | UIImage *snapshot = UIGraphicsGetImageFromCurrentImageContext(); | ||
| 31 | UIGraphicsEndImageContext(); | ||
| 32 | return snapshot; | ||
| 33 | } | ||
| 34 | |||
| 35 | + (UIImage *)fb_imageForViewLayer:(UIView *)view | ||
| 36 | { | ||
| 37 | [view layoutIfNeeded]; | ||
| 38 | return [self fb_imageForLayer:view.layer]; | ||
| 39 | } | ||
| 40 | |||
| 41 | + (UIImage *)fb_imageForView:(UIView *)view | ||
| 42 | { | ||
| 43 | CGRect bounds = view.bounds; | ||
| 44 | NSAssert1(CGRectGetWidth(bounds), @"Zero width for view %@", view); | ||
| 45 | NSAssert1(CGRectGetHeight(bounds), @"Zero height for view %@", view); | ||
| 46 | |||
| 47 | // If the input view is already a UIWindow, then just use that. Otherwise wrap in a window. | ||
| 48 | UIWindow *window = [view isKindOfClass:[UIWindow class]] ? (UIWindow *)view : view.window; | ||
| 49 | BOOL removeFromSuperview = NO; | ||
| 50 | if (!window) { | ||
| 51 | window = [[UIApplication sharedApplication] fb_strictKeyWindow]; | ||
| 52 | } | ||
| 53 | |||
| 54 | if (!view.window && view != window) { | ||
| 55 | [window addSubview:view]; | ||
| 56 | removeFromSuperview = YES; | ||
| 57 | } | ||
| 58 | |||
| 59 | UIGraphicsBeginImageContextWithOptions(bounds.size, NO, 0); | ||
| 60 | [view layoutIfNeeded]; | ||
| 61 | [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES]; | ||
| 62 | |||
| 63 | UIImage *snapshot = UIGraphicsGetImageFromCurrentImageContext(); | ||
| 64 | UIGraphicsEndImageContext(); | ||
| 65 | |||
| 66 | if (removeFromSuperview) { | ||
| 67 | [view removeFromSuperview]; | ||
| 68 | } | ||
| 69 | |||
| 70 | return snapshot; | ||
| 71 | } | ||
| 72 | |||
| 73 | @end |
| 1 | /* | ||
| 2 | * Copyright (c) 2015, Facebook, Inc. | ||
| 3 | * All rights reserved. | ||
| 4 | * | ||
| 5 | * This source code is licensed under the BSD-style license found in the | ||
| 6 | * LICENSE file in the root directory of this source tree. An additional grant | ||
| 7 | * of patent rights can be found in the PATENTS file in the same directory. | ||
| 8 | * | ||
| 9 | */ | ||
| 10 | |||
| 11 | #import <FBSnapshotTestCase/FBSnapshotTestCasePlatform.h> | ||
| 12 | #import <FBSnapshotTestCase/FBSnapshotTestController.h> | ||
| 13 | |||
| 14 | #import <QuartzCore/QuartzCore.h> | ||
| 15 | |||
| 16 | #import <UIKit/UIKit.h> | ||
| 17 | |||
| 18 | #import <XCTest/XCTest.h> | ||
| 19 | |||
| 20 | /* | ||
| 21 | There are three ways of setting reference image directories. | ||
| 22 | |||
| 23 | 1. Set the preprocessor macro FB_REFERENCE_IMAGE_DIR to a double quoted | ||
| 24 | c-string with the path. | ||
| 25 | 2. Set an environment variable named FB_REFERENCE_IMAGE_DIR with the path. This | ||
| 26 | takes precedence over the preprocessor macro to allow for run-time override. | ||
| 27 | 3. Keep everything unset, which will cause the reference images to be looked up | ||
| 28 | inside the bundle holding the current test, in the | ||
| 29 | Resources/ReferenceImages_* directories. | ||
| 30 | */ | ||
| 31 | #ifndef FB_REFERENCE_IMAGE_DIR | ||
| 32 | #define FB_REFERENCE_IMAGE_DIR "" | ||
| 33 | #endif | ||
| 34 | |||
| 35 | /** | ||
| 36 | Similar to our much-loved XCTAssert() macros. Use this to perform your test. No need to write an explanation, though. | ||
| 37 | @param view The view to snapshot | ||
| 38 | @param identifier An optional identifier, used if there are multiple snapshot tests in a given -test method. | ||
| 39 | @param suffixes An NSOrderedSet of strings for the different suffixes | ||
| 40 | @param tolerance The percentage of pixels that can differ and still count as an 'identical' view | ||
| 41 | */ | ||
| 42 | #define FBSnapshotVerifyViewWithOptions(view__, identifier__, suffixes__, tolerance__) \ | ||
| 43 | FBSnapshotVerifyViewOrLayerWithOptions(View, view__, identifier__, suffixes__, tolerance__) | ||
| 44 | |||
| 45 | #define FBSnapshotVerifyView(view__, identifier__) \ | ||
| 46 | FBSnapshotVerifyViewWithOptions(view__, identifier__, FBSnapshotTestCaseDefaultSuffixes(), 0) | ||
| 47 | |||
| 48 | |||
| 49 | /** | ||
| 50 | Similar to our much-loved XCTAssert() macros. Use this to perform your test. No need to write an explanation, though. | ||
| 51 | @param layer The layer to snapshot | ||
| 52 | @param identifier An optional identifier, used if there are multiple snapshot tests in a given -test method. | ||
| 53 | @param suffixes An NSOrderedSet of strings for the different suffixes | ||
| 54 | @param tolerance The percentage of pixels that can differ and still count as an 'identical' layer | ||
| 55 | */ | ||
| 56 | #define FBSnapshotVerifyLayerWithOptions(layer__, identifier__, suffixes__, tolerance__) \ | ||
| 57 | FBSnapshotVerifyViewOrLayerWithOptions(Layer, layer__, identifier__, suffixes__, tolerance__) | ||
| 58 | |||
| 59 | #define FBSnapshotVerifyLayer(layer__, identifier__) \ | ||
| 60 | FBSnapshotVerifyLayerWithOptions(layer__, identifier__, FBSnapshotTestCaseDefaultSuffixes(), 0) | ||
| 61 | |||
| 62 | |||
| 63 | #define FBSnapshotVerifyViewOrLayerWithOptions(what__, viewOrLayer__, identifier__, suffixes__, tolerance__) \ | ||
| 64 | { \ | ||
| 65 | NSString *errorDescription = [self snapshotVerifyViewOrLayer:viewOrLayer__ identifier:identifier__ suffixes:suffixes__ tolerance:tolerance__]; \ | ||
| 66 | BOOL noErrors = (errorDescription == nil); \ | ||
| 67 | XCTAssertTrue(noErrors, @"%@", errorDescription); \ | ||
| 68 | } | ||
| 69 | |||
| 70 | |||
| 71 | /** | ||
| 72 | The base class of view snapshotting tests. If you have small UI component, it's often easier to configure it in a test | ||
| 73 | and compare an image of the view to a reference image that write lots of complex layout-code tests. | ||
| 74 | |||
| 75 | In order to flip the tests in your subclass to record the reference images set @c recordMode to @c YES. | ||
| 76 | |||
| 77 | @attention When recording, the reference image directory should be explicitly | ||
| 78 | set, otherwise the images may be written to somewhere inside the | ||
| 79 | simulator directory. | ||
| 80 | |||
| 81 | For example: | ||
| 82 | @code | ||
| 83 | - (void)setUp | ||
| 84 | { | ||
| 85 | [super setUp]; | ||
| 86 | self.recordMode = YES; | ||
| 87 | } | ||
| 88 | @endcode | ||
| 89 | */ | ||
| 90 | @interface FBSnapshotTestCase : XCTestCase | ||
| 91 | |||
| 92 | /** | ||
| 93 | When YES, the test macros will save reference images, rather than performing an actual test. | ||
| 94 | */ | ||
| 95 | @property (readwrite, nonatomic, assign) BOOL recordMode; | ||
| 96 | |||
| 97 | /** | ||
| 98 | When @c YES appends the name of the device model and OS to the snapshot file name. | ||
| 99 | The default value is @c NO. | ||
| 100 | */ | ||
| 101 | @property (readwrite, nonatomic, assign, getter=isDeviceAgnostic) BOOL deviceAgnostic; | ||
| 102 | |||
| 103 | /** | ||
| 104 | When YES, renders a snapshot of the complete view hierarchy as visible onscreen. | ||
| 105 | There are several things that do not work if renderInContext: is used. | ||
| 106 | - UIVisualEffect #70 | ||
| 107 | - UIAppearance #91 | ||
| 108 | - Size Classes #92 | ||
| 109 | |||
| 110 | @attention If the view does't belong to a UIWindow, it will create one and add the view as a subview. | ||
| 111 | */ | ||
| 112 | @property (readwrite, nonatomic, assign) BOOL usesDrawViewHierarchyInRect; | ||
| 113 | |||
| 114 | - (void)setUp NS_REQUIRES_SUPER; | ||
| 115 | - (void)tearDown NS_REQUIRES_SUPER; | ||
| 116 | |||
| 117 | /** | ||
| 118 | Performs the comparison or records a snapshot of the layer if recordMode is YES. | ||
| 119 | @param viewOrLayer The UIView or CALayer to snapshot | ||
| 120 | @param identifier An optional identifier, used if there are multiple snapshot tests in a given -test method. | ||
| 121 | @param suffixes An NSOrderedSet of strings for the different suffixes | ||
| 122 | @param tolerance The percentage difference to still count as identical - 0 mean pixel perfect, 1 means I don't care | ||
| 123 | @returns nil if the comparison (or saving of the reference image) succeeded. Otherwise it contains an error description. | ||
| 124 | */ | ||
| 125 | - (NSString *)snapshotVerifyViewOrLayer:(id)viewOrLayer | ||
| 126 | identifier:(NSString *)identifier | ||
| 127 | suffixes:(NSOrderedSet *)suffixes | ||
| 128 | tolerance:(CGFloat)tolerance; | ||
| 129 | |||
| 130 | /** | ||
| 131 | Performs the comparison or records a snapshot of the layer if recordMode is YES. | ||
| 132 | @param layer The Layer to snapshot | ||
| 133 | @param referenceImagesDirectory The directory in which reference images are stored. | ||
| 134 | @param identifier An optional identifier, used if there are multiple snapshot tests in a given -test method. | ||
| 135 | @param tolerance The percentage difference to still count as identical - 0 mean pixel perfect, 1 means I don't care | ||
| 136 | @param errorPtr An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). | ||
| 137 | @returns YES if the comparison (or saving of the reference image) succeeded. | ||
| 138 | */ | ||
| 139 | - (BOOL)compareSnapshotOfLayer:(CALayer *)layer | ||
| 140 | referenceImagesDirectory:(NSString *)referenceImagesDirectory | ||
| 141 | identifier:(NSString *)identifier | ||
| 142 | tolerance:(CGFloat)tolerance | ||
| 143 | error:(NSError **)errorPtr; | ||
| 144 | |||
| 145 | /** | ||
| 146 | Performs the comparison or records a snapshot of the view if recordMode is YES. | ||
| 147 | @param view The view to snapshot | ||
| 148 | @param referenceImagesDirectory The directory in which reference images are stored. | ||
| 149 | @param identifier An optional identifier, used if there are multiple snapshot tests in a given -test method. | ||
| 150 | @param tolerance The percentage difference to still count as identical - 0 mean pixel perfect, 1 means I don't care | ||
| 151 | @param errorPtr An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). | ||
| 152 | @returns YES if the comparison (or saving of the reference image) succeeded. | ||
| 153 | */ | ||
| 154 | - (BOOL)compareSnapshotOfView:(UIView *)view | ||
| 155 | referenceImagesDirectory:(NSString *)referenceImagesDirectory | ||
| 156 | identifier:(NSString *)identifier | ||
| 157 | tolerance:(CGFloat)tolerance | ||
| 158 | error:(NSError **)errorPtr; | ||
| 159 | |||
| 160 | /** | ||
| 161 | Checks if reference image with identifier based name exists in the reference images directory. | ||
| 162 | @param referenceImagesDirectory The directory in which reference images are stored. | ||
| 163 | @param identifier An optional identifier, used if there are multiple snapshot tests in a given -test method. | ||
| 164 | @param errorPtr An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). | ||
| 165 | @returns YES if reference image exists. | ||
| 166 | */ | ||
| 167 | - (BOOL)referenceImageRecordedInDirectory:(NSString *)referenceImagesDirectory | ||
| 168 | identifier:(NSString *)identifier | ||
| 169 | error:(NSError **)errorPtr; | ||
| 170 | |||
| 171 | /** | ||
| 172 | Returns the reference image directory. | ||
| 173 | |||
| 174 | Helper function used to implement the assert macros. | ||
| 175 | |||
| 176 | @param dir directory to use if environment variable not specified. Ignored if null or empty. | ||
| 177 | */ | ||
| 178 | - (NSString *)getReferenceImageDirectoryWithDefault:(NSString *)dir; | ||
| 179 | |||
| 180 | @end |
| 1 | /* | ||
| 2 | * Copyright (c) 2015, Facebook, Inc. | ||
| 3 | * All rights reserved. | ||
| 4 | * | ||
| 5 | * This source code is licensed under the BSD-style license found in the | ||
| 6 | * LICENSE file in the root directory of this source tree. An additional grant | ||
| 7 | * of patent rights can be found in the PATENTS file in the same directory. | ||
| 8 | * | ||
| 9 | */ | ||
| 10 | |||
| 11 | #import <FBSnapshotTestCase/FBSnapshotTestCase.h> | ||
| 12 | #import <FBSnapshotTestCase/FBSnapshotTestController.h> | ||
| 13 | |||
| 14 | @implementation FBSnapshotTestCase | ||
| 15 | { | ||
| 16 | FBSnapshotTestController *_snapshotController; | ||
| 17 | } | ||
| 18 | |||
| 19 | #pragma mark - Overrides | ||
| 20 | |||
| 21 | - (void)setUp | ||
| 22 | { | ||
| 23 | [super setUp]; | ||
| 24 | _snapshotController = [[FBSnapshotTestController alloc] initWithTestName:NSStringFromClass([self class])]; | ||
| 25 | } | ||
| 26 | |||
| 27 | - (void)tearDown | ||
| 28 | { | ||
| 29 | _snapshotController = nil; | ||
| 30 | [super tearDown]; | ||
| 31 | } | ||
| 32 | |||
| 33 | - (BOOL)recordMode | ||
| 34 | { | ||
| 35 | return _snapshotController.recordMode; | ||
| 36 | } | ||
| 37 | |||
| 38 | - (void)setRecordMode:(BOOL)recordMode | ||
| 39 | { | ||
| 40 | NSAssert1(_snapshotController, @"%s cannot be called before [super setUp]", __FUNCTION__); | ||
| 41 | _snapshotController.recordMode = recordMode; | ||
| 42 | } | ||
| 43 | |||
| 44 | - (BOOL)isDeviceAgnostic | ||
| 45 | { | ||
| 46 | return _snapshotController.deviceAgnostic; | ||
| 47 | } | ||
| 48 | |||
| 49 | - (void)setDeviceAgnostic:(BOOL)deviceAgnostic | ||
| 50 | { | ||
| 51 | NSAssert1(_snapshotController, @"%s cannot be called before [super setUp]", __FUNCTION__); | ||
| 52 | _snapshotController.deviceAgnostic = deviceAgnostic; | ||
| 53 | } | ||
| 54 | |||
| 55 | - (BOOL)usesDrawViewHierarchyInRect | ||
| 56 | { | ||
| 57 | return _snapshotController.usesDrawViewHierarchyInRect; | ||
| 58 | } | ||
| 59 | |||
| 60 | - (void)setUsesDrawViewHierarchyInRect:(BOOL)usesDrawViewHierarchyInRect | ||
| 61 | { | ||
| 62 | NSAssert1(_snapshotController, @"%s cannot be called before [super setUp]", __FUNCTION__); | ||
| 63 | _snapshotController.usesDrawViewHierarchyInRect = usesDrawViewHierarchyInRect; | ||
| 64 | } | ||
| 65 | |||
| 66 | #pragma mark - Public API | ||
| 67 | |||
| 68 | - (NSString *)snapshotVerifyViewOrLayer:(id)viewOrLayer | ||
| 69 | identifier:(NSString *)identifier | ||
| 70 | suffixes:(NSOrderedSet *)suffixes | ||
| 71 | tolerance:(CGFloat)tolerance | ||
| 72 | { | ||
| 73 | if (nil == viewOrLayer) { | ||
| 74 | return @"Object to be snapshotted must not be nil"; | ||
| 75 | } | ||
| 76 | NSString *referenceImageDirectory = [self getReferenceImageDirectoryWithDefault:(@ FB_REFERENCE_IMAGE_DIR)]; | ||
| 77 | if (referenceImageDirectory == nil) { | ||
| 78 | return @"Missing value for referenceImagesDirectory - Set FB_REFERENCE_IMAGE_DIR as Environment variable in your scheme."; | ||
| 79 | } | ||
| 80 | if (suffixes.count == 0) { | ||
| 81 | return [NSString stringWithFormat:@"Suffixes set cannot be empty %@", suffixes]; | ||
| 82 | } | ||
| 83 | |||
| 84 | BOOL testSuccess = NO; | ||
| 85 | NSError *error = nil; | ||
| 86 | NSMutableArray *errors = [NSMutableArray array]; | ||
| 87 | |||
| 88 | if (self.recordMode) { | ||
| 89 | NSString *referenceImagesDirectory = [NSString stringWithFormat:@"%@%@", referenceImageDirectory, suffixes.firstObject]; | ||
| 90 | BOOL referenceImageSaved = [self _compareSnapshotOfViewOrLayer:viewOrLayer referenceImagesDirectory:referenceImagesDirectory identifier:(identifier) tolerance:tolerance error:&error]; | ||
| 91 | if (!referenceImageSaved) { | ||
| 92 | [errors addObject:error]; | ||
| 93 | } | ||
| 94 | } else { | ||
| 95 | for (NSString *suffix in suffixes) { | ||
| 96 | NSString *referenceImagesDirectory = [NSString stringWithFormat:@"%@%@", referenceImageDirectory, suffix]; | ||
| 97 | BOOL referenceImageAvailable = [self referenceImageRecordedInDirectory:referenceImagesDirectory identifier:(identifier) error:&error]; | ||
| 98 | |||
| 99 | if (referenceImageAvailable) { | ||
| 100 | BOOL comparisonSuccess = [self _compareSnapshotOfViewOrLayer:viewOrLayer referenceImagesDirectory:referenceImagesDirectory identifier:identifier tolerance:tolerance error:&error]; | ||
| 101 | [errors removeAllObjects]; | ||
| 102 | if (comparisonSuccess) { | ||
| 103 | testSuccess = YES; | ||
| 104 | break; | ||
| 105 | } else { | ||
| 106 | [errors addObject:error]; | ||
| 107 | } | ||
| 108 | } else { | ||
| 109 | [errors addObject:error]; | ||
| 110 | } | ||
| 111 | } | ||
| 112 | } | ||
| 113 | |||
| 114 | if (!testSuccess) { | ||
| 115 | return [NSString stringWithFormat:@"Snapshot comparison failed: %@", errors.firstObject]; | ||
| 116 | } | ||
| 117 | if (self.recordMode) { | ||
| 118 | return @"Test ran in record mode. Reference image is now saved. Disable record mode to perform an actual snapshot comparison!"; | ||
| 119 | } | ||
| 120 | |||
| 121 | return nil; | ||
| 122 | } | ||
| 123 | |||
| 124 | - (BOOL)compareSnapshotOfLayer:(CALayer *)layer | ||
| 125 | referenceImagesDirectory:(NSString *)referenceImagesDirectory | ||
| 126 | identifier:(NSString *)identifier | ||
| 127 | tolerance:(CGFloat)tolerance | ||
| 128 | error:(NSError **)errorPtr | ||
| 129 | { | ||
| 130 | return [self _compareSnapshotOfViewOrLayer:layer | ||
| 131 | referenceImagesDirectory:referenceImagesDirectory | ||
| 132 | identifier:identifier | ||
| 133 | tolerance:tolerance | ||
| 134 | error:errorPtr]; | ||
| 135 | } | ||
| 136 | |||
| 137 | - (BOOL)compareSnapshotOfView:(UIView *)view | ||
| 138 | referenceImagesDirectory:(NSString *)referenceImagesDirectory | ||
| 139 | identifier:(NSString *)identifier | ||
| 140 | tolerance:(CGFloat)tolerance | ||
| 141 | error:(NSError **)errorPtr | ||
| 142 | { | ||
| 143 | return [self _compareSnapshotOfViewOrLayer:view | ||
| 144 | referenceImagesDirectory:referenceImagesDirectory | ||
| 145 | identifier:identifier | ||
| 146 | tolerance:tolerance | ||
| 147 | error:errorPtr]; | ||
| 148 | } | ||
| 149 | |||
| 150 | - (BOOL)referenceImageRecordedInDirectory:(NSString *)referenceImagesDirectory | ||
| 151 | identifier:(NSString *)identifier | ||
| 152 | error:(NSError **)errorPtr | ||
| 153 | { | ||
| 154 | NSAssert1(_snapshotController, @"%s cannot be called before [super setUp]", __FUNCTION__); | ||
| 155 | _snapshotController.referenceImagesDirectory = referenceImagesDirectory; | ||
| 156 | UIImage *referenceImage = [_snapshotController referenceImageForSelector:self.invocation.selector | ||
| 157 | identifier:identifier | ||
| 158 | error:errorPtr]; | ||
| 159 | |||
| 160 | return (referenceImage != nil); | ||
| 161 | } | ||
| 162 | |||
| 163 | - (NSString *)getReferenceImageDirectoryWithDefault:(NSString *)dir | ||
| 164 | { | ||
| 165 | NSString *envReferenceImageDirectory = [NSProcessInfo processInfo].environment[@"FB_REFERENCE_IMAGE_DIR"]; | ||
| 166 | if (envReferenceImageDirectory) { | ||
| 167 | return envReferenceImageDirectory; | ||
| 168 | } | ||
| 169 | if (dir && dir.length > 0) { | ||
| 170 | return dir; | ||
| 171 | } | ||
| 172 | return [[NSBundle bundleForClass:self.class].resourcePath stringByAppendingPathComponent:@"ReferenceImages"]; | ||
| 173 | } | ||
| 174 | |||
| 175 | |||
| 176 | #pragma mark - Private API | ||
| 177 | |||
| 178 | - (BOOL)_compareSnapshotOfViewOrLayer:(id)viewOrLayer | ||
| 179 | referenceImagesDirectory:(NSString *)referenceImagesDirectory | ||
| 180 | identifier:(NSString *)identifier | ||
| 181 | tolerance:(CGFloat)tolerance | ||
| 182 | error:(NSError **)errorPtr | ||
| 183 | { | ||
| 184 | _snapshotController.referenceImagesDirectory = referenceImagesDirectory; | ||
| 185 | return [_snapshotController compareSnapshotOfViewOrLayer:viewOrLayer | ||
| 186 | selector:self.invocation.selector | ||
| 187 | identifier:identifier | ||
| 188 | tolerance:tolerance | ||
| 189 | error:errorPtr]; | ||
| 190 | } | ||
| 191 | |||
| 192 | @end |
| 1 | /* | ||
| 2 | * Copyright (c) 2015, Facebook, Inc. | ||
| 3 | * All rights reserved. | ||
| 4 | * | ||
| 5 | * This source code is licensed under the BSD-style license found in the | ||
| 6 | * LICENSE file in the root directory of this source tree. An additional grant | ||
| 7 | * of patent rights can be found in the PATENTS file in the same directory. | ||
| 8 | * | ||
| 9 | */ | ||
| 10 | |||
| 11 | #import <Foundation/Foundation.h> | ||
| 12 | |||
| 13 | #ifdef __cplusplus | ||
| 14 | extern "C" { | ||
| 15 | #endif | ||
| 16 | |||
| 17 | /** | ||
| 18 | Returns a Boolean value that indicates whether the snapshot test is running in 64Bit. | ||
| 19 | This method is a convenience for creating the suffixes set based on the architecture | ||
| 20 | that the test is running. | ||
| 21 | |||
| 22 | @returns @c YES if the test is running in 64bit, otherwise @c NO. | ||
| 23 | */ | ||
| 24 | BOOL FBSnapshotTestCaseIs64Bit(void); | ||
| 25 | |||
| 26 | /** | ||
| 27 | Returns a default set of strings that is used to append a suffix based on the architectures. | ||
| 28 | @warning Do not modify this function, you can create your own and use it with @c FBSnapshotVerifyViewWithOptions() | ||
| 29 | |||
| 30 | @returns An @c NSOrderedSet object containing strings that are appended to the reference images directory. | ||
| 31 | */ | ||
| 32 | NSOrderedSet *FBSnapshotTestCaseDefaultSuffixes(void); | ||
| 33 | |||
| 34 | /** | ||
| 35 | Returns a fully «normalized» file name. | ||
| 36 | Strips punctuation and spaces and replaces them with @c _. Also appends the device model, running OS and screen size to the file name. | ||
| 37 | |||
| 38 | @returns An @c NSString object containing the passed @c fileName with the device model, OS and screen size appended at the end. | ||
| 39 | */ | ||
| 40 | NSString *FBDeviceAgnosticNormalizedFileName(NSString *fileName); | ||
| 41 | |||
| 42 | #ifdef __cplusplus | ||
| 43 | } | ||
| 44 | #endif |
| 1 | /* | ||
| 2 | * Copyright (c) 2015, Facebook, Inc. | ||
| 3 | * All rights reserved. | ||
| 4 | * | ||
| 5 | * This source code is licensed under the BSD-style license found in the | ||
| 6 | * LICENSE file in the root directory of this source tree. An additional grant | ||
| 7 | * of patent rights can be found in the PATENTS file in the same directory. | ||
| 8 | * | ||
| 9 | */ | ||
| 10 | |||
| 11 | #import <FBSnapshotTestCase/FBSnapshotTestCasePlatform.h> | ||
| 12 | #import <FBSnapshotTestCase/UIApplication+StrictKeyWindow.h> | ||
| 13 | #import <UIKit/UIKit.h> | ||
| 14 | |||
| 15 | BOOL FBSnapshotTestCaseIs64Bit(void) | ||
| 16 | { | ||
| 17 | #if __LP64__ | ||
| 18 | return YES; | ||
| 19 | #else | ||
| 20 | return NO; | ||
| 21 | #endif | ||
| 22 | } | ||
| 23 | |||
| 24 | NSOrderedSet *FBSnapshotTestCaseDefaultSuffixes(void) | ||
| 25 | { | ||
| 26 | NSMutableOrderedSet *suffixesSet = [[NSMutableOrderedSet alloc] init]; | ||
| 27 | [suffixesSet addObject:@"_32"]; | ||
| 28 | [suffixesSet addObject:@"_64"]; | ||
| 29 | if (FBSnapshotTestCaseIs64Bit()) { | ||
| 30 | return [suffixesSet reversedOrderedSet]; | ||
| 31 | } | ||
| 32 | return [suffixesSet copy]; | ||
| 33 | } | ||
| 34 | |||
| 35 | NSString *FBDeviceAgnosticNormalizedFileName(NSString *fileName) | ||
| 36 | { | ||
| 37 | UIDevice *device = [UIDevice currentDevice]; | ||
| 38 | UIWindow *keyWindow = [[UIApplication sharedApplication] fb_strictKeyWindow]; | ||
| 39 | CGSize screenSize = keyWindow.bounds.size; | ||
| 40 | NSString *os = device.systemVersion; | ||
| 41 | |||
| 42 | fileName = [NSString stringWithFormat:@"%@_%@%@_%.0fx%.0f", fileName, device.model, os, screenSize.width, screenSize.height]; | ||
| 43 | |||
| 44 | NSMutableCharacterSet *invalidCharacters = [NSMutableCharacterSet new]; | ||
| 45 | [invalidCharacters formUnionWithCharacterSet:[NSCharacterSet whitespaceCharacterSet]]; | ||
| 46 | [invalidCharacters formUnionWithCharacterSet:[NSCharacterSet punctuationCharacterSet]]; | ||
| 47 | NSArray *validComponents = [fileName componentsSeparatedByCharactersInSet:invalidCharacters]; | ||
| 48 | fileName = [validComponents componentsJoinedByString:@"_"]; | ||
| 49 | |||
| 50 | return fileName; | ||
| 51 | } | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | /* | ||
| 2 | * Copyright (c) 2015, Facebook, Inc. | ||
| 3 | * All rights reserved. | ||
| 4 | * | ||
| 5 | * This source code is licensed under the BSD-style license found in the | ||
| 6 | * LICENSE file in the root directory of this source tree. An additional grant | ||
| 7 | * of patent rights can be found in the PATENTS file in the same directory. | ||
| 8 | * | ||
| 9 | */ | ||
| 10 | |||
| 11 | #import <Foundation/Foundation.h> | ||
| 12 | #import <UIKit/UIKit.h> | ||
| 13 | |||
| 14 | typedef NS_ENUM(NSInteger, FBSnapshotTestControllerErrorCode) { | ||
| 15 | FBSnapshotTestControllerErrorCodeUnknown, | ||
| 16 | FBSnapshotTestControllerErrorCodeNeedsRecord, | ||
| 17 | FBSnapshotTestControllerErrorCodePNGCreationFailed, | ||
| 18 | FBSnapshotTestControllerErrorCodeImagesDifferentSizes, | ||
| 19 | FBSnapshotTestControllerErrorCodeImagesDifferent, | ||
| 20 | }; | ||
| 21 | /** | ||
| 22 | Errors returned by the methods of FBSnapshotTestController use this domain. | ||
| 23 | */ | ||
| 24 | extern NSString *const FBSnapshotTestControllerErrorDomain; | ||
| 25 | |||
| 26 | /** | ||
| 27 | Errors returned by the methods of FBSnapshotTestController sometimes contain this key in the `userInfo` dictionary. | ||
| 28 | */ | ||
| 29 | extern NSString *const FBReferenceImageFilePathKey; | ||
| 30 | |||
| 31 | /** | ||
| 32 | Errors returned by the methods of FBSnapshotTestController sometimes contain this key in the `userInfo` dictionary. | ||
| 33 | */ | ||
| 34 | extern NSString *const FBReferenceImageKey; | ||
| 35 | |||
| 36 | /** | ||
| 37 | Errors returned by the methods of FBSnapshotTestController sometimes contain this key in the `userInfo` dictionary. | ||
| 38 | */ | ||
| 39 | extern NSString *const FBCapturedImageKey; | ||
| 40 | |||
| 41 | /** | ||
| 42 | Errors returned by the methods of FBSnapshotTestController sometimes contain this key in the `userInfo` dictionary. | ||
| 43 | */ | ||
| 44 | extern NSString *const FBDiffedImageKey; | ||
| 45 | |||
| 46 | /** | ||
| 47 | Provides the heavy-lifting for FBSnapshotTestCase. It loads and saves images, along with performing the actual pixel- | ||
| 48 | by-pixel comparison of images. | ||
| 49 | Instances are initialized with the test class, and directories to read and write to. | ||
| 50 | */ | ||
| 51 | @interface FBSnapshotTestController : NSObject | ||
| 52 | |||
| 53 | /** | ||
| 54 | Record snapshots. | ||
| 55 | */ | ||
| 56 | @property (readwrite, nonatomic, assign) BOOL recordMode; | ||
| 57 | |||
| 58 | /** | ||
| 59 | When @c YES appends the name of the device model and OS to the snapshot file name. | ||
| 60 | The default value is @c NO. | ||
| 61 | */ | ||
| 62 | @property (readwrite, nonatomic, assign, getter=isDeviceAgnostic) BOOL deviceAgnostic; | ||
| 63 | |||
| 64 | /** | ||
| 65 | Uses drawViewHierarchyInRect:afterScreenUpdates: to draw the image instead of renderInContext: | ||
| 66 | */ | ||
| 67 | @property (readwrite, nonatomic, assign) BOOL usesDrawViewHierarchyInRect; | ||
| 68 | |||
| 69 | /** | ||
| 70 | The directory in which referfence images are stored. | ||
| 71 | */ | ||
| 72 | @property (readwrite, nonatomic, copy) NSString *referenceImagesDirectory; | ||
| 73 | |||
| 74 | /** | ||
| 75 | @param testClass The subclass of FBSnapshotTestCase that is using this controller. | ||
| 76 | @returns An instance of FBSnapshotTestController. | ||
| 77 | */ | ||
| 78 | - (instancetype)initWithTestClass:(Class)testClass; | ||
| 79 | |||
| 80 | /** | ||
| 81 | Designated initializer. | ||
| 82 | @param testName The name of the tests. | ||
| 83 | @returns An instance of FBSnapshotTestController. | ||
| 84 | */ | ||
| 85 | - (instancetype)initWithTestName:(NSString *)testName; | ||
| 86 | |||
| 87 | /** | ||
| 88 | Performs the comparison of the layer. | ||
| 89 | @param layer The Layer to snapshot. | ||
| 90 | @param selector The test method being run. | ||
| 91 | @param identifier An optional identifier, used is there are muliptle snapshot tests in a given -test method. | ||
| 92 | @param error An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). | ||
| 93 | @returns YES if the comparison (or saving of the reference image) succeeded. | ||
| 94 | */ | ||
| 95 | - (BOOL)compareSnapshotOfLayer:(CALayer *)layer | ||
| 96 | selector:(SEL)selector | ||
| 97 | identifier:(NSString *)identifier | ||
| 98 | error:(NSError **)errorPtr; | ||
| 99 | |||
| 100 | /** | ||
| 101 | Performs the comparison of the view. | ||
| 102 | @param view The view to snapshot. | ||
| 103 | @param selector The test method being run. | ||
| 104 | @param identifier An optional identifier, used is there are muliptle snapshot tests in a given -test method. | ||
| 105 | @param error An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). | ||
| 106 | @returns YES if the comparison (or saving of the reference image) succeeded. | ||
| 107 | */ | ||
| 108 | - (BOOL)compareSnapshotOfView:(UIView *)view | ||
| 109 | selector:(SEL)selector | ||
| 110 | identifier:(NSString *)identifier | ||
| 111 | error:(NSError **)errorPtr; | ||
| 112 | |||
| 113 | /** | ||
| 114 | Performs the comparison of a view or layer. | ||
| 115 | @param view The view or layer to snapshot. | ||
| 116 | @param selector The test method being run. | ||
| 117 | @param identifier An optional identifier, used is there are muliptle snapshot tests in a given -test method. | ||
| 118 | @param tolerance The percentage of pixels that can differ and still be considered 'identical' | ||
| 119 | @param error An error to log in an XCTAssert() macro if the method fails (missing reference image, images differ, etc). | ||
| 120 | @returns YES if the comparison (or saving of the reference image) succeeded. | ||
| 121 | */ | ||
| 122 | - (BOOL)compareSnapshotOfViewOrLayer:(id)viewOrLayer | ||
| 123 | selector:(SEL)selector | ||
| 124 | identifier:(NSString *)identifier | ||
| 125 | tolerance:(CGFloat)tolerance | ||
| 126 | error:(NSError **)errorPtr; | ||
| 127 | |||
| 128 | /** | ||
| 129 | Loads a reference image. | ||
| 130 | @param selector The test method being run. | ||
| 131 | @param identifier The optional identifier, used when multiple images are tested in a single -test method. | ||
| 132 | @param errorPtr An error, if this methods returns nil, the error will be something useful. | ||
| 133 | @returns An image. | ||
| 134 | */ | ||
| 135 | - (UIImage *)referenceImageForSelector:(SEL)selector | ||
| 136 | identifier:(NSString *)identifier | ||
| 137 | error:(NSError **)errorPtr; | ||
| 138 | |||
| 139 | /** | ||
| 140 | Performs a pixel-by-pixel comparison of the two images with an allowable margin of error. | ||
| 141 | @param referenceImage The reference (correct) image. | ||
| 142 | @param image The image to test against the reference. | ||
| 143 | @param tolerance The percentage of pixels that can differ and still be considered 'identical' | ||
| 144 | @param errorPtr An error that indicates why the comparison failed if it does. | ||
| 145 | @returns YES if the comparison succeeded and the images are the same(ish). | ||
| 146 | */ | ||
| 147 | - (BOOL)compareReferenceImage:(UIImage *)referenceImage | ||
| 148 | toImage:(UIImage *)image | ||
| 149 | tolerance:(CGFloat)tolerance | ||
| 150 | error:(NSError **)errorPtr; | ||
| 151 | |||
| 152 | /** | ||
| 153 | Saves the reference image and the test image to `failedOutputDirectory`. | ||
| 154 | @param referenceImage The reference (correct) image. | ||
| 155 | @param testImage The image to test against the reference. | ||
| 156 | @param selector The test method being run. | ||
| 157 | @param identifier The optional identifier, used when multiple images are tested in a single -test method. | ||
| 158 | @param errorPtr An error that indicates why the comparison failed if it does. | ||
| 159 | @returns YES if the save succeeded. | ||
| 160 | */ | ||
| 161 | - (BOOL)saveFailedReferenceImage:(UIImage *)referenceImage | ||
| 162 | testImage:(UIImage *)testImage | ||
| 163 | selector:(SEL)selector | ||
| 164 | identifier:(NSString *)identifier | ||
| 165 | error:(NSError **)errorPtr; | ||
| 166 | @end |
| 1 | /* | ||
| 2 | * Copyright (c) 2015, Facebook, Inc. | ||
| 3 | * All rights reserved. | ||
| 4 | * | ||
| 5 | * This source code is licensed under the BSD-style license found in the | ||
| 6 | * LICENSE file in the root directory of this source tree. An additional grant | ||
| 7 | * of patent rights can be found in the PATENTS file in the same directory. | ||
| 8 | * | ||
| 9 | */ | ||
| 10 | |||
| 11 | #import <FBSnapshotTestCase/FBSnapshotTestController.h> | ||
| 12 | #import <FBSnapshotTestCase/FBSnapshotTestCasePlatform.h> | ||
| 13 | #import <FBSnapshotTestCase/UIImage+Compare.h> | ||
| 14 | #import <FBSnapshotTestCase/UIImage+Diff.h> | ||
| 15 | #import <FBSnapshotTestCase/UIImage+Snapshot.h> | ||
| 16 | |||
| 17 | #import <UIKit/UIKit.h> | ||
| 18 | |||
| 19 | NSString *const FBSnapshotTestControllerErrorDomain = @"FBSnapshotTestControllerErrorDomain"; | ||
| 20 | NSString *const FBReferenceImageFilePathKey = @"FBReferenceImageFilePathKey"; | ||
| 21 | NSString *const FBReferenceImageKey = @"FBReferenceImageKey"; | ||
| 22 | NSString *const FBCapturedImageKey = @"FBCapturedImageKey"; | ||
| 23 | NSString *const FBDiffedImageKey = @"FBDiffedImageKey"; | ||
| 24 | |||
| 25 | typedef NS_ENUM(NSUInteger, FBTestSnapshotFileNameType) { | ||
| 26 | FBTestSnapshotFileNameTypeReference, | ||
| 27 | FBTestSnapshotFileNameTypeFailedReference, | ||
| 28 | FBTestSnapshotFileNameTypeFailedTest, | ||
| 29 | FBTestSnapshotFileNameTypeFailedTestDiff, | ||
| 30 | }; | ||
| 31 | |||
| 32 | @implementation FBSnapshotTestController | ||
| 33 | { | ||
| 34 | NSString *_testName; | ||
| 35 | NSFileManager *_fileManager; | ||
| 36 | } | ||
| 37 | |||
| 38 | #pragma mark - Initializers | ||
| 39 | |||
| 40 | - (instancetype)initWithTestClass:(Class)testClass; | ||
| 41 | { | ||
| 42 | return [self initWithTestName:NSStringFromClass(testClass)]; | ||
| 43 | } | ||
| 44 | |||
| 45 | - (instancetype)initWithTestName:(NSString *)testName | ||
| 46 | { | ||
| 47 | if (self = [super init]) { | ||
| 48 | _testName = [testName copy]; | ||
| 49 | _deviceAgnostic = NO; | ||
| 50 | |||
| 51 | _fileManager = [[NSFileManager alloc] init]; | ||
| 52 | } | ||
| 53 | return self; | ||
| 54 | } | ||
| 55 | |||
| 56 | #pragma mark - Overrides | ||
| 57 | |||
| 58 | - (NSString *)description | ||
| 59 | { | ||
| 60 | return [NSString stringWithFormat:@"%@ %@", [super description], _referenceImagesDirectory]; | ||
| 61 | } | ||
| 62 | |||
| 63 | #pragma mark - Public API | ||
| 64 | |||
| 65 | - (BOOL)compareSnapshotOfLayer:(CALayer *)layer | ||
| 66 | selector:(SEL)selector | ||
| 67 | identifier:(NSString *)identifier | ||
| 68 | error:(NSError **)errorPtr | ||
| 69 | { | ||
| 70 | return [self compareSnapshotOfViewOrLayer:layer | ||
| 71 | selector:selector | ||
| 72 | identifier:identifier | ||
| 73 | tolerance:0 | ||
| 74 | error:errorPtr]; | ||
| 75 | } | ||
| 76 | |||
| 77 | - (BOOL)compareSnapshotOfView:(UIView *)view | ||
| 78 | selector:(SEL)selector | ||
| 79 | identifier:(NSString *)identifier | ||
| 80 | error:(NSError **)errorPtr | ||
| 81 | { | ||
| 82 | return [self compareSnapshotOfViewOrLayer:view | ||
| 83 | selector:selector | ||
| 84 | identifier:identifier | ||
| 85 | tolerance:0 | ||
| 86 | error:errorPtr]; | ||
| 87 | } | ||
| 88 | |||
| 89 | - (BOOL)compareSnapshotOfViewOrLayer:(id)viewOrLayer | ||
| 90 | selector:(SEL)selector | ||
| 91 | identifier:(NSString *)identifier | ||
| 92 | tolerance:(CGFloat)tolerance | ||
| 93 | error:(NSError **)errorPtr | ||
| 94 | { | ||
| 95 | if (self.recordMode) { | ||
| 96 | return [self _recordSnapshotOfViewOrLayer:viewOrLayer selector:selector identifier:identifier error:errorPtr]; | ||
| 97 | } else { | ||
| 98 | return [self _performPixelComparisonWithViewOrLayer:viewOrLayer selector:selector identifier:identifier tolerance:tolerance error:errorPtr]; | ||
| 99 | } | ||
| 100 | } | ||
| 101 | |||
| 102 | - (UIImage *)referenceImageForSelector:(SEL)selector | ||
| 103 | identifier:(NSString *)identifier | ||
| 104 | error:(NSError **)errorPtr | ||
| 105 | { | ||
| 106 | NSString *filePath = [self _referenceFilePathForSelector:selector identifier:identifier]; | ||
| 107 | UIImage *image = [UIImage imageWithContentsOfFile:filePath]; | ||
| 108 | if (nil == image && NULL != errorPtr) { | ||
| 109 | BOOL exists = [_fileManager fileExistsAtPath:filePath]; | ||
| 110 | if (!exists) { | ||
| 111 | *errorPtr = [NSError errorWithDomain:FBSnapshotTestControllerErrorDomain | ||
| 112 | code:FBSnapshotTestControllerErrorCodeNeedsRecord | ||
| 113 | userInfo:@{ | ||
| 114 | FBReferenceImageFilePathKey: filePath, | ||
| 115 | NSLocalizedDescriptionKey: @"Unable to load reference image.", | ||
| 116 | NSLocalizedFailureReasonErrorKey: @"Reference image not found. You need to run the test in record mode", | ||
| 117 | }]; | ||
| 118 | } else { | ||
| 119 | *errorPtr = [NSError errorWithDomain:FBSnapshotTestControllerErrorDomain | ||
| 120 | code:FBSnapshotTestControllerErrorCodeUnknown | ||
| 121 | userInfo:nil]; | ||
| 122 | } | ||
| 123 | } | ||
| 124 | return image; | ||
| 125 | } | ||
| 126 | |||
| 127 | - (BOOL)compareReferenceImage:(UIImage *)referenceImage | ||
| 128 | toImage:(UIImage *)image | ||
| 129 | tolerance:(CGFloat)tolerance | ||
| 130 | error:(NSError **)errorPtr | ||
| 131 | { | ||
| 132 | BOOL sameImageDimensions = CGSizeEqualToSize(referenceImage.size, image.size); | ||
| 133 | if (sameImageDimensions && [referenceImage fb_compareWithImage:image tolerance:tolerance]) { | ||
| 134 | return YES; | ||
| 135 | } | ||
| 136 | |||
| 137 | if (NULL != errorPtr) { | ||
| 138 | NSString *errorDescription = sameImageDimensions ? @"Images different" : @"Images different sizes"; | ||
| 139 | NSString *errorReason = sameImageDimensions ? [NSString stringWithFormat:@"image pixels differed by more than %.2f%% from the reference image", tolerance * 100] | ||
| 140 | : [NSString stringWithFormat:@"referenceImage:%@, image:%@", NSStringFromCGSize(referenceImage.size), NSStringFromCGSize(image.size)]; | ||
| 141 | FBSnapshotTestControllerErrorCode errorCode = sameImageDimensions ? FBSnapshotTestControllerErrorCodeImagesDifferent : FBSnapshotTestControllerErrorCodeImagesDifferentSizes; | ||
| 142 | |||
| 143 | *errorPtr = [NSError errorWithDomain:FBSnapshotTestControllerErrorDomain | ||
| 144 | code:errorCode | ||
| 145 | userInfo:@{ | ||
| 146 | NSLocalizedDescriptionKey: errorDescription, | ||
| 147 | NSLocalizedFailureReasonErrorKey: errorReason, | ||
| 148 | FBReferenceImageKey: referenceImage, | ||
| 149 | FBCapturedImageKey: image, | ||
| 150 | FBDiffedImageKey: [referenceImage fb_diffWithImage:image], | ||
| 151 | }]; | ||
| 152 | } | ||
| 153 | return NO; | ||
| 154 | } | ||
| 155 | |||
| 156 | - (BOOL)saveFailedReferenceImage:(UIImage *)referenceImage | ||
| 157 | testImage:(UIImage *)testImage | ||
| 158 | selector:(SEL)selector | ||
| 159 | identifier:(NSString *)identifier | ||
| 160 | error:(NSError **)errorPtr | ||
| 161 | { | ||
| 162 | NSData *referencePNGData = UIImagePNGRepresentation(referenceImage); | ||
| 163 | NSData *testPNGData = UIImagePNGRepresentation(testImage); | ||
| 164 | |||
| 165 | NSString *referencePath = [self _failedFilePathForSelector:selector | ||
| 166 | identifier:identifier | ||
| 167 | fileNameType:FBTestSnapshotFileNameTypeFailedReference]; | ||
| 168 | |||
| 169 | NSError *creationError = nil; | ||
| 170 | BOOL didCreateDir = [_fileManager createDirectoryAtPath:[referencePath stringByDeletingLastPathComponent] | ||
| 171 | withIntermediateDirectories:YES | ||
| 172 | attributes:nil | ||
| 173 | error:&creationError]; | ||
| 174 | if (!didCreateDir) { | ||
| 175 | if (NULL != errorPtr) { | ||
| 176 | *errorPtr = creationError; | ||
| 177 | } | ||
| 178 | return NO; | ||
| 179 | } | ||
| 180 | |||
| 181 | if (![referencePNGData writeToFile:referencePath options:NSDataWritingAtomic error:errorPtr]) { | ||
| 182 | return NO; | ||
| 183 | } | ||
| 184 | |||
| 185 | NSString *testPath = [self _failedFilePathForSelector:selector | ||
| 186 | identifier:identifier | ||
| 187 | fileNameType:FBTestSnapshotFileNameTypeFailedTest]; | ||
| 188 | |||
| 189 | if (![testPNGData writeToFile:testPath options:NSDataWritingAtomic error:errorPtr]) { | ||
| 190 | return NO; | ||
| 191 | } | ||
| 192 | |||
| 193 | NSString *diffPath = [self _failedFilePathForSelector:selector | ||
| 194 | identifier:identifier | ||
| 195 | fileNameType:FBTestSnapshotFileNameTypeFailedTestDiff]; | ||
| 196 | |||
| 197 | UIImage *diffImage = [referenceImage fb_diffWithImage:testImage]; | ||
| 198 | NSData *diffImageData = UIImagePNGRepresentation(diffImage); | ||
| 199 | |||
| 200 | if (![diffImageData writeToFile:diffPath options:NSDataWritingAtomic error:errorPtr]) { | ||
| 201 | return NO; | ||
| 202 | } | ||
| 203 | |||
| 204 | NSLog(@"If you have Kaleidoscope installed you can run this command to see an image diff:\n" | ||
| 205 | @"ksdiff \"%@\" \"%@\"", referencePath, testPath); | ||
| 206 | |||
| 207 | return YES; | ||
| 208 | } | ||
| 209 | |||
| 210 | #pragma mark - Private API | ||
| 211 | |||
| 212 | - (NSString *)_fileNameForSelector:(SEL)selector | ||
| 213 | identifier:(NSString *)identifier | ||
| 214 | fileNameType:(FBTestSnapshotFileNameType)fileNameType | ||
| 215 | { | ||
| 216 | NSString *fileName = nil; | ||
| 217 | switch (fileNameType) { | ||
| 218 | case FBTestSnapshotFileNameTypeFailedReference: | ||
| 219 | fileName = @"reference_"; | ||
| 220 | break; | ||
| 221 | case FBTestSnapshotFileNameTypeFailedTest: | ||
| 222 | fileName = @"failed_"; | ||
| 223 | break; | ||
| 224 | case FBTestSnapshotFileNameTypeFailedTestDiff: | ||
| 225 | fileName = @"diff_"; | ||
| 226 | break; | ||
| 227 | default: | ||
| 228 | fileName = @""; | ||
| 229 | break; | ||
| 230 | } | ||
| 231 | fileName = [fileName stringByAppendingString:NSStringFromSelector(selector)]; | ||
| 232 | if (0 < identifier.length) { | ||
| 233 | fileName = [fileName stringByAppendingFormat:@"_%@", identifier]; | ||
| 234 | } | ||
| 235 | |||
| 236 | if (self.isDeviceAgnostic) { | ||
| 237 | fileName = FBDeviceAgnosticNormalizedFileName(fileName); | ||
| 238 | } | ||
| 239 | |||
| 240 | if ([[UIScreen mainScreen] scale] > 1) { | ||
| 241 | fileName = [fileName stringByAppendingFormat:@"@%.fx", [[UIScreen mainScreen] scale]]; | ||
| 242 | } | ||
| 243 | fileName = [fileName stringByAppendingPathExtension:@"png"]; | ||
| 244 | return fileName; | ||
| 245 | } | ||
| 246 | |||
| 247 | - (NSString *)_referenceFilePathForSelector:(SEL)selector | ||
| 248 | identifier:(NSString *)identifier | ||
| 249 | { | ||
| 250 | NSString *fileName = [self _fileNameForSelector:selector | ||
| 251 | identifier:identifier | ||
| 252 | fileNameType:FBTestSnapshotFileNameTypeReference]; | ||
| 253 | NSString *filePath = [_referenceImagesDirectory stringByAppendingPathComponent:_testName]; | ||
| 254 | filePath = [filePath stringByAppendingPathComponent:fileName]; | ||
| 255 | return filePath; | ||
| 256 | } | ||
| 257 | |||
| 258 | - (NSString *)_failedFilePathForSelector:(SEL)selector | ||
| 259 | identifier:(NSString *)identifier | ||
| 260 | fileNameType:(FBTestSnapshotFileNameType)fileNameType | ||
| 261 | { | ||
| 262 | NSString *fileName = [self _fileNameForSelector:selector | ||
| 263 | identifier:identifier | ||
| 264 | fileNameType:fileNameType]; | ||
| 265 | NSString *folderPath = NSTemporaryDirectory(); | ||
| 266 | if (getenv("IMAGE_DIFF_DIR")) { | ||
| 267 | folderPath = @(getenv("IMAGE_DIFF_DIR")); | ||
| 268 | } | ||
| 269 | NSString *filePath = [folderPath stringByAppendingPathComponent:_testName]; | ||
| 270 | filePath = [filePath stringByAppendingPathComponent:fileName]; | ||
| 271 | return filePath; | ||
| 272 | } | ||
| 273 | |||
| 274 | - (BOOL)_performPixelComparisonWithViewOrLayer:(id)viewOrLayer | ||
| 275 | selector:(SEL)selector | ||
| 276 | identifier:(NSString *)identifier | ||
| 277 | tolerance:(CGFloat)tolerance | ||
| 278 | error:(NSError **)errorPtr | ||
| 279 | { | ||
| 280 | UIImage *referenceImage = [self referenceImageForSelector:selector identifier:identifier error:errorPtr]; | ||
| 281 | if (nil != referenceImage) { | ||
| 282 | UIImage *snapshot = [self _imageForViewOrLayer:viewOrLayer]; | ||
| 283 | BOOL imagesSame = [self compareReferenceImage:referenceImage toImage:snapshot tolerance:tolerance error:errorPtr]; | ||
| 284 | if (!imagesSame) { | ||
| 285 | NSError *saveError = nil; | ||
| 286 | if ([self saveFailedReferenceImage:referenceImage testImage:snapshot selector:selector identifier:identifier error:&saveError] == NO) { | ||
| 287 | NSLog(@"Error saving test images: %@", saveError); | ||
| 288 | } | ||
| 289 | } | ||
| 290 | return imagesSame; | ||
| 291 | } | ||
| 292 | return NO; | ||
| 293 | } | ||
| 294 | |||
| 295 | - (BOOL)_recordSnapshotOfViewOrLayer:(id)viewOrLayer | ||
| 296 | selector:(SEL)selector | ||
| 297 | identifier:(NSString *)identifier | ||
| 298 | error:(NSError **)errorPtr | ||
| 299 | { | ||
| 300 | UIImage *snapshot = [self _imageForViewOrLayer:viewOrLayer]; | ||
| 301 | return [self _saveReferenceImage:snapshot selector:selector identifier:identifier error:errorPtr]; | ||
| 302 | } | ||
| 303 | |||
| 304 | - (BOOL)_saveReferenceImage:(UIImage *)image | ||
| 305 | selector:(SEL)selector | ||
| 306 | identifier:(NSString *)identifier | ||
| 307 | error:(NSError **)errorPtr | ||
| 308 | { | ||
| 309 | BOOL didWrite = NO; | ||
| 310 | if (nil != image) { | ||
| 311 | NSString *filePath = [self _referenceFilePathForSelector:selector identifier:identifier]; | ||
| 312 | NSData *pngData = UIImagePNGRepresentation(image); | ||
| 313 | if (nil != pngData) { | ||
| 314 | NSError *creationError = nil; | ||
| 315 | BOOL didCreateDir = [_fileManager createDirectoryAtPath:[filePath stringByDeletingLastPathComponent] | ||
| 316 | withIntermediateDirectories:YES | ||
| 317 | attributes:nil | ||
| 318 | error:&creationError]; | ||
| 319 | if (!didCreateDir) { | ||
| 320 | if (NULL != errorPtr) { | ||
| 321 | *errorPtr = creationError; | ||
| 322 | } | ||
| 323 | return NO; | ||
| 324 | } | ||
| 325 | didWrite = [pngData writeToFile:filePath options:NSDataWritingAtomic error:errorPtr]; | ||
| 326 | if (didWrite) { | ||
| 327 | NSLog(@"Reference image save at: %@", filePath); | ||
| 328 | } | ||
| 329 | } else { | ||
| 330 | if (nil != errorPtr) { | ||
| 331 | *errorPtr = [NSError errorWithDomain:FBSnapshotTestControllerErrorDomain | ||
| 332 | code:FBSnapshotTestControllerErrorCodePNGCreationFailed | ||
| 333 | userInfo:@{ | ||
| 334 | FBReferenceImageFilePathKey: filePath, | ||
| 335 | }]; | ||
| 336 | } | ||
| 337 | } | ||
| 338 | } | ||
| 339 | return didWrite; | ||
| 340 | } | ||
| 341 | |||
| 342 | - (UIImage *)_imageForViewOrLayer:(id)viewOrLayer | ||
| 343 | { | ||
| 344 | if ([viewOrLayer isKindOfClass:[UIView class]]) { | ||
| 345 | if (_usesDrawViewHierarchyInRect) { | ||
| 346 | return [UIImage fb_imageForView:viewOrLayer]; | ||
| 347 | } else { | ||
| 348 | return [UIImage fb_imageForViewLayer:viewOrLayer]; | ||
| 349 | } | ||
| 350 | } else if ([viewOrLayer isKindOfClass:[CALayer class]]) { | ||
| 351 | return [UIImage fb_imageForLayer:viewOrLayer]; | ||
| 352 | } else { | ||
| 353 | [NSException raise:@"Only UIView and CALayer classes can be snapshotted" format:@"%@", viewOrLayer]; | ||
| 354 | } | ||
| 355 | return nil; | ||
| 356 | } | ||
| 357 | |||
| 358 | @end |
| 1 | /* | ||
| 2 | * Copyright (c) 2015, Facebook, Inc. | ||
| 3 | * All rights reserved. | ||
| 4 | * | ||
| 5 | * This source code is licensed under the BSD-style license found in the | ||
| 6 | * LICENSE file in the root directory of this source tree. An additional grant | ||
| 7 | * of patent rights can be found in the PATENTS file in the same directory. | ||
| 8 | * | ||
| 9 | */ | ||
| 10 | |||
| 11 | #if swift(>=3) | ||
| 12 | public extension FBSnapshotTestCase { | ||
| 13 | public func FBSnapshotVerifyView(_ view: UIView, identifier: String = "", suffixes: NSOrderedSet = FBSnapshotTestCaseDefaultSuffixes(), tolerance: CGFloat = 0, file: StaticString = #file, line: UInt = #line) { | ||
| 14 | FBSnapshotVerifyViewOrLayer(view, identifier: identifier, suffixes: suffixes, tolerance: tolerance, file: file, line: line) | ||
| 15 | } | ||
| 16 | |||
| 17 | public func FBSnapshotVerifyLayer(_ layer: CALayer, identifier: String = "", suffixes: NSOrderedSet = FBSnapshotTestCaseDefaultSuffixes(), tolerance: CGFloat = 0, file: StaticString = #file, line: UInt = #line) { | ||
| 18 | FBSnapshotVerifyViewOrLayer(layer, identifier: identifier, suffixes: suffixes, tolerance: tolerance, file: file, line: line) | ||
| 19 | } | ||
| 20 | |||
| 21 | private func FBSnapshotVerifyViewOrLayer(_ viewOrLayer: AnyObject, identifier: String = "", suffixes: NSOrderedSet = FBSnapshotTestCaseDefaultSuffixes(), tolerance: CGFloat = 0, file: StaticString = #file, line: UInt = #line) { | ||
| 22 | let envReferenceImageDirectory = self.getReferenceImageDirectory(withDefault: FB_REFERENCE_IMAGE_DIR) | ||
| 23 | var error: NSError? | ||
| 24 | var comparisonSuccess = false | ||
| 25 | |||
| 26 | if let envReferenceImageDirectory = envReferenceImageDirectory { | ||
| 27 | for suffix in suffixes { | ||
| 28 | let referenceImagesDirectory = "\(envReferenceImageDirectory)\(suffix)" | ||
| 29 | if viewOrLayer.isKind(of: UIView.self) { | ||
| 30 | do { | ||
| 31 | try compareSnapshot(of: viewOrLayer as! UIView, referenceImagesDirectory: referenceImagesDirectory, identifier: identifier, tolerance: tolerance) | ||
| 32 | comparisonSuccess = true | ||
| 33 | } catch let error1 as NSError { | ||
| 34 | error = error1 | ||
| 35 | comparisonSuccess = false | ||
| 36 | } | ||
| 37 | } else if viewOrLayer.isKind(of: CALayer.self) { | ||
| 38 | do { | ||
| 39 | try compareSnapshot(of: viewOrLayer as! CALayer, referenceImagesDirectory: referenceImagesDirectory, identifier: identifier, tolerance: tolerance) | ||
| 40 | comparisonSuccess = true | ||
| 41 | } catch let error1 as NSError { | ||
| 42 | error = error1 | ||
| 43 | comparisonSuccess = false | ||
| 44 | } | ||
| 45 | } else { | ||
| 46 | assertionFailure("Only UIView and CALayer classes can be snapshotted") | ||
| 47 | } | ||
| 48 | |||
| 49 | assert(recordMode == false, message: "Test ran in record mode. Reference image is now saved. Disable record mode to perform an actual snapshot comparison!", file: file, line: line) | ||
| 50 | |||
| 51 | if comparisonSuccess || recordMode { | ||
| 52 | break | ||
| 53 | } | ||
| 54 | |||
| 55 | assert(comparisonSuccess, message: "Snapshot comparison failed: \(error)", file: file, line: line) | ||
| 56 | } | ||
| 57 | } else { | ||
| 58 | XCTFail("Missing value for referenceImagesDirectory - Set FB_REFERENCE_IMAGE_DIR as Environment variable in your scheme.") | ||
| 59 | } | ||
| 60 | } | ||
| 61 | |||
| 62 | func assert(_ assertion: Bool, message: String, file: StaticString, line: UInt) { | ||
| 63 | if !assertion { | ||
| 64 | XCTFail(message, file: file, line: line) | ||
| 65 | } | ||
| 66 | } | ||
| 67 | } | ||
| 68 | #else | ||
| 69 | public extension FBSnapshotTestCase { | ||
| 70 | public func FBSnapshotVerifyView(view: UIView, identifier: String = "", suffixes: NSOrderedSet = FBSnapshotTestCaseDefaultSuffixes(), tolerance: CGFloat = 0, file: StaticString = #file, line: UInt = #line) { | ||
| 71 | FBSnapshotVerifyViewOrLayer(view, identifier: identifier, suffixes: suffixes, tolerance: tolerance, file: file, line: line) | ||
| 72 | } | ||
| 73 | |||
| 74 | public func FBSnapshotVerifyLayer(layer: CALayer, identifier: String = "", suffixes: NSOrderedSet = FBSnapshotTestCaseDefaultSuffixes(), tolerance: CGFloat = 0, file: StaticString = #file, line: UInt = #line) { | ||
| 75 | FBSnapshotVerifyViewOrLayer(layer, identifier: identifier, suffixes: suffixes, tolerance: tolerance, file: file, line: line) | ||
| 76 | } | ||
| 77 | |||
| 78 | private func FBSnapshotVerifyViewOrLayer(viewOrLayer: AnyObject, identifier: String = "", suffixes: NSOrderedSet = FBSnapshotTestCaseDefaultSuffixes(), tolerance: CGFloat = 0, file: StaticString = #file, line: UInt = #line) { | ||
| 79 | let envReferenceImageDirectory = self.getReferenceImageDirectoryWithDefault(FB_REFERENCE_IMAGE_DIR) | ||
| 80 | var error: NSError? | ||
| 81 | var comparisonSuccess = false | ||
| 82 | |||
| 83 | if let envReferenceImageDirectory = envReferenceImageDirectory { | ||
| 84 | for suffix in suffixes { | ||
| 85 | let referenceImagesDirectory = "\(envReferenceImageDirectory)\(suffix)" | ||
| 86 | if viewOrLayer.isKindOfClass(UIView) { | ||
| 87 | do { | ||
| 88 | try compareSnapshotOfView(viewOrLayer as! UIView, referenceImagesDirectory: referenceImagesDirectory, identifier: identifier, tolerance: tolerance) | ||
| 89 | comparisonSuccess = true | ||
| 90 | } catch let error1 as NSError { | ||
| 91 | error = error1 | ||
| 92 | comparisonSuccess = false | ||
| 93 | } | ||
| 94 | } else if viewOrLayer.isKindOfClass(CALayer) { | ||
| 95 | do { | ||
| 96 | try compareSnapshotOfLayer(viewOrLayer as! CALayer, referenceImagesDirectory: referenceImagesDirectory, identifier: identifier, tolerance: tolerance) | ||
| 97 | comparisonSuccess = true | ||
| 98 | } catch let error1 as NSError { | ||
| 99 | error = error1 | ||
| 100 | comparisonSuccess = false | ||
| 101 | } | ||
| 102 | } else { | ||
| 103 | assertionFailure("Only UIView and CALayer classes can be snapshotted") | ||
| 104 | } | ||
| 105 | |||
| 106 | assert(recordMode == false, message: "Test ran in record mode. Reference image is now saved. Disable record mode to perform an actual snapshot comparison!", file: file, line: line) | ||
| 107 | |||
| 108 | if comparisonSuccess || recordMode { | ||
| 109 | break | ||
| 110 | } | ||
| 111 | |||
| 112 | assert(comparisonSuccess, message: "Snapshot comparison failed: \(error)", file: file, line: line) | ||
| 113 | } | ||
| 114 | } else { | ||
| 115 | XCTFail("Missing value for referenceImagesDirectory - Set FB_REFERENCE_IMAGE_DIR as Environment variable in your scheme.") | ||
| 116 | } | ||
| 117 | } | ||
| 118 | |||
| 119 | func assert(assertion: Bool, message: String, file: StaticString, line: UInt) { | ||
| 120 | if !assertion { | ||
| 121 | XCTFail(message, file: file, line: line) | ||
| 122 | } | ||
| 123 | } | ||
| 124 | } | ||
| 125 | #endif |
Example/Pods/FBSnapshotTestCase/LICENSE
0 → 100644
| 1 | BSD License | ||
| 2 | |||
| 3 | For the FBSnapshotTestCase software | ||
| 4 | |||
| 5 | Copyright (c) 2013, Facebook, Inc. | ||
| 6 | All rights reserved. | ||
| 7 | |||
| 8 | Redistribution and use in source and binary forms, with or without | ||
| 9 | modification, are permitted provided that the following conditions are met: | ||
| 10 | |||
| 11 | * Redistributions of source code must retain the above copyright notice, | ||
| 12 | this list of conditions and the following disclaimer. | ||
| 13 | * Redistributions in binary form must reproduce the above copyright notice, | ||
| 14 | this list of conditions and the following disclaimer in the documentation | ||
| 15 | and/or other materials provided with the distribution. | ||
| 16 | * Neither the name Facebook nor the names of its contributors may be used to | ||
| 17 | endorse or promote products derived from this software without specific | ||
| 18 | prior written permission. | ||
| 19 | |||
| 20 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||
| 21 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
| 22 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
| 23 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | ||
| 24 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
| 25 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||
| 26 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 27 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | ||
| 28 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
| 29 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
Example/Pods/FBSnapshotTestCase/README.md
0 → 100644
| 1 | FBSnapshotTestCase | ||
| 2 | ====================== | ||
| 3 | |||
| 4 | [](https://travis-ci.org/facebook/ios-snapshot-test-case) [](http://cocoadocs.org/docsets/FBSnapshotTestCase/) | ||
| 5 | |||
| 6 | What it does | ||
| 7 | ------------ | ||
| 8 | |||
| 9 | A "snapshot test case" takes a configured `UIView` or `CALayer` and uses the | ||
| 10 | `renderInContext:` method to get an image snapshot of its contents. It | ||
| 11 | compares this snapshot to a "reference image" stored in your source code | ||
| 12 | repository and fails the test if the two images don't match. | ||
| 13 | |||
| 14 | Why? | ||
| 15 | ---- | ||
| 16 | |||
| 17 | At Facebook we write a lot of UI code. As you might imagine, each type of | ||
| 18 | feed story is rendered using a subclass of `UIView`. There are a lot of edge | ||
| 19 | cases that we want to handle correctly: | ||
| 20 | |||
| 21 | - What if there is more text than can fit in the space available? | ||
| 22 | - What if an image doesn't match the size of an image view? | ||
| 23 | - What should the highlighted state look like? | ||
| 24 | |||
| 25 | It's straightforward to test logic code, but less obvious how you should test | ||
| 26 | views. You can do a lot of rectangle asserts, but these are hard to understand | ||
| 27 | or visualize. Looking at an image diff shows you exactly what changed and how | ||
| 28 | it will look to users. | ||
| 29 | |||
| 30 | We developed `FBSnapshotTestCase` to make snapshot tests easy. | ||
| 31 | |||
| 32 | Installation with CocoaPods | ||
| 33 | --------------------------- | ||
| 34 | |||
| 35 | 1. Add the following lines to your Podfile: | ||
| 36 | |||
| 37 | ``` | ||
| 38 | target "Tests" do | ||
| 39 | pod 'FBSnapshotTestCase' | ||
| 40 | end | ||
| 41 | ``` | ||
| 42 | |||
| 43 | If you support iOS 7 use `FBSnapshotTestCase/Core` instead, which doesn't contain Swift support. | ||
| 44 | |||
| 45 | Replace "Tests" with the name of your test project. | ||
| 46 | |||
| 47 | 2. There are [three ways](https://github.com/facebook/ios-snapshot-test-case/blob/master/FBSnapshotTestCase/FBSnapshotTestCase.h#L19-L29) of setting reference image directories, the recommended one is to define `FB_REFERENCE_IMAGE_DIR` in your scheme. This should point to the directory where you want reference images to be stored. At Facebook, we normally use this: | ||
| 48 | |||
| 49 | |Name|Value| | ||
| 50 | |:---|:----| | ||
| 51 | |`FB_REFERENCE_IMAGE_DIR`|`$(SOURCE_ROOT)/$(PROJECT_NAME)Tests/ReferenceImages`| | ||
| 52 | |||
| 53 | |||
| 54 |  | ||
| 55 | |||
| 56 | Creating a snapshot test | ||
| 57 | ------------------------ | ||
| 58 | |||
| 59 | 1. Subclass `FBSnapshotTestCase` instead of `XCTestCase`. | ||
| 60 | 2. From within your test, use `FBSnapshotVerifyView`. | ||
| 61 | 3. Run the test once with `self.recordMode = YES;` in the test's `-setUp` | ||
| 62 | method. (This creates the reference images on disk.) | ||
| 63 | 4. Remove the line enabling record mode and run the test. | ||
| 64 | |||
| 65 | Features | ||
| 66 | -------- | ||
| 67 | |||
| 68 | - Automatically names reference images on disk according to test class and | ||
| 69 | selector. | ||
| 70 | - Prints a descriptive error message to the console on failure. (Bonus: | ||
| 71 | failure message includes a one-line command to see an image diff if | ||
| 72 | you have [Kaleidoscope](http://www.kaleidoscopeapp.com) installed.) | ||
| 73 | - Supply an optional "identifier" if you want to perform multiple snapshots | ||
| 74 | in a single test method. | ||
| 75 | - Support for `CALayer` via `FBSnapshotVerifyLayer`. | ||
| 76 | - `usesDrawViewHierarchyInRect` to handle cases like `UIVisualEffect`, `UIAppearance` and Size Classes. | ||
| 77 | - `isDeviceAgnostic` to allow appending the device model (`iPhone`, `iPad`, `iPod Touch`, etc), OS version and screen size to the images (allowing to have multiple tests for the same «snapshot» for different `OS`s and devices). | ||
| 78 | |||
| 79 | Notes | ||
| 80 | ----- | ||
| 81 | |||
| 82 | Your unit test must be an "application test", not a "logic test." (That is, it | ||
| 83 | must be run within the Simulator so that it has access to UIKit.) In Xcode 5 | ||
| 84 | and later new projects only offer application tests, but older projects will | ||
| 85 | have separate targets for the two types. | ||
| 86 | |||
| 87 | Authors | ||
| 88 | ------- | ||
| 89 | |||
| 90 | `FBSnapshotTestCase` was written at Facebook by | ||
| 91 | [Jonathan Dann](https://facebook.com/j.p.dann) with significant contributions by | ||
| 92 | [Todd Krabach](https://facebook.com/toddkrabach). | ||
| 93 | |||
| 94 | License | ||
| 95 | ------- | ||
| 96 | |||
| 97 | `FBSnapshotTestCase` is BSD-licensed. See `LICENSE`. |
| 1 | { | ||
| 2 | "name": "JCategoryKit", | ||
| 3 | "version": "1.0.0", | ||
| 4 | "summary": "A short description of JCategoryKit.", | ||
| 5 | "description": "TODO: Add long description of the pod here.", | ||
| 6 | "homepage": "https://github.com/weixq/JCategoryKit", | ||
| 7 | "license": { | ||
| 8 | "type": "MIT", | ||
| 9 | "file": "LICENSE" | ||
| 10 | }, | ||
| 11 | "authors": { | ||
| 12 | "weixq": "weixiaoqiang@situdata.com" | ||
| 13 | }, | ||
| 14 | "source": { | ||
| 15 | "git": "http://gitlab.situdata.com/weixiaoqiang/JCategoryKit.git", | ||
| 16 | "tag": "1.0.0" | ||
| 17 | }, | ||
| 18 | "platforms": { | ||
| 19 | "ios": "9.0" | ||
| 20 | }, | ||
| 21 | "source_files": "JCategoryKit/Classes/**/*" | ||
| 22 | } |
Example/Pods/Manifest.lock
0 → 100644
| 1 | PODS: | ||
| 2 | - FBSnapshotTestCase (2.1.4): | ||
| 3 | - FBSnapshotTestCase/SwiftSupport (= 2.1.4) | ||
| 4 | - FBSnapshotTestCase/Core (2.1.4) | ||
| 5 | - FBSnapshotTestCase/SwiftSupport (2.1.4): | ||
| 6 | - FBSnapshotTestCase/Core | ||
| 7 | - JCategoryKit (1.0.0) | ||
| 8 | |||
| 9 | DEPENDENCIES: | ||
| 10 | - FBSnapshotTestCase | ||
| 11 | - JCategoryKit (from `../`) | ||
| 12 | |||
| 13 | SPEC REPOS: | ||
| 14 | trunk: | ||
| 15 | - FBSnapshotTestCase | ||
| 16 | |||
| 17 | EXTERNAL SOURCES: | ||
| 18 | JCategoryKit: | ||
| 19 | :path: "../" | ||
| 20 | |||
| 21 | SPEC CHECKSUMS: | ||
| 22 | FBSnapshotTestCase: 094f9f314decbabe373b87cc339bea235a63e07a | ||
| 23 | JCategoryKit: 1ee089cd5593b2515c06f8b99e9eb02fdac4eecd | ||
| 24 | |||
| 25 | PODFILE CHECKSUM: 7301f47448ac58a307221e0e73e2a910d76a70ab | ||
| 26 | |||
| 27 | COCOAPODS: 1.11.2 |
Example/Pods/Pods.xcodeproj/project.pbxproj
0 → 100644
| 1 | // !$*UTF8*$! | ||
| 2 | { | ||
| 3 | archiveVersion = 1; | ||
| 4 | classes = { | ||
| 5 | }; | ||
| 6 | objectVersion = 46; | ||
| 7 | objects = { | ||
| 8 | |||
| 9 | /* Begin PBXBuildFile section */ | ||
| 10 | 04DE749AC277F07A69D6AF304E06D6FA /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 57221B54D014471C3D3E1925EFC917C8 /* Foundation.framework */; }; | ||
| 11 | 1F84FE646CD1D7BAFFB58C243277AFF8 /* FBSnapshotTestCase-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E5923010B02074CAA9AAF6EA02D66AA /* FBSnapshotTestCase-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; | ||
| 12 | 2101891E285D1927B7AB429B796A82AC /* JCategoryKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 25058F6BDCA0C96A7C5542322D6158E5 /* JCategoryKit-dummy.m */; }; | ||
| 13 | 29672FC10D2BAB45AA7C917EAEFEADA7 /* Pods-JCategoryKit_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0A7811A013D5E2B56B7D15A742EE5242 /* Pods-JCategoryKit_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; | ||
| 14 | 2975A09730FD83DC0897129A11EA6585 /* SwiftSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F0D66CF296ABBC57EC4D0452397E235 /* SwiftSupport.swift */; }; | ||
| 15 | 2B88C28DD20CBFA7B3AEB21A365197FE /* FBSnapshotTestController.h in Headers */ = {isa = PBXBuildFile; fileRef = AE9FF9459FBCDC4AF88FB6B5A4CC1439 /* FBSnapshotTestController.h */; settings = {ATTRIBUTES = (Public, ); }; }; | ||
| 16 | 2CB61F6FA511CAACB43A50DC3A82E0DD /* UIImage+Snapshot.m in Sources */ = {isa = PBXBuildFile; fileRef = D872A3EE224412D4057C234FBC629F9C /* UIImage+Snapshot.m */; }; | ||
| 17 | 2ECCAC52EF4C74E1032E0BC646BBE5B9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 57221B54D014471C3D3E1925EFC917C8 /* Foundation.framework */; }; | ||
| 18 | 30D475DF57C0C682A723231E7BCA0D14 /* FBSnapshotTestCasePlatform.m in Sources */ = {isa = PBXBuildFile; fileRef = 6ABB3EB3CCC5BCA82F40FE8DC87BB778 /* FBSnapshotTestCasePlatform.m */; }; | ||
| 19 | 373413256658309F9053CE22BF62077E /* UIImage+Snapshot.h in Headers */ = {isa = PBXBuildFile; fileRef = 284833D18C244D2B42966B6EE425AA59 /* UIImage+Snapshot.h */; settings = {ATTRIBUTES = (Private, ); }; }; | ||
| 20 | 4EA5082D8AFD068CBCA52EA79768584E /* JCategoryKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5824C3B2567490C69753CDF1904EAE58 /* JCategoryKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; | ||
| 21 | 539D867D3777C433A977FDBD94DCB65F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 57221B54D014471C3D3E1925EFC917C8 /* Foundation.framework */; }; | ||
| 22 | 5558B876B579BC1E79BD3D2B19148329 /* UIApplication+StrictKeyWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 99A67367E018411D614EC8536A8A1C5B /* UIApplication+StrictKeyWindow.h */; settings = {ATTRIBUTES = (Project, ); }; }; | ||
| 23 | 5BE525FF6FA14B999ED2CCC0AA4FA0CF /* FBSnapshotTestCase-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1ADA6E655DC84D06359BD0ED5E36C783 /* FBSnapshotTestCase-dummy.m */; }; | ||
| 24 | 640CCE9C3A28AA3CA15510899F9140EE /* FBSnapshotTestCasePlatform.h in Headers */ = {isa = PBXBuildFile; fileRef = 88B1DEEBF6316A84D7413645212492FF /* FBSnapshotTestCasePlatform.h */; settings = {ATTRIBUTES = (Public, ); }; }; | ||
| 25 | 67F1963AA7C9EDB78127AD5F566A4949 /* UIImage+Diff.h in Headers */ = {isa = PBXBuildFile; fileRef = 96187BF3038121CC146335E9FF0B0AFF /* UIImage+Diff.h */; settings = {ATTRIBUTES = (Private, ); }; }; | ||
| 26 | 74339C58AC4E5631FB8C0E662668A796 /* UIApplication+StrictKeyWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F538C426803AE34255FC6E35B408CCA /* UIApplication+StrictKeyWindow.m */; }; | ||
| 27 | 7AD0FD677AAD06ABCA1B7926BC18E140 /* Pods-JCategoryKit_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 18EA9877485F4CAB556E863AE7756146 /* Pods-JCategoryKit_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; | ||
| 28 | 7C67CBD15D9B5D0B7769B2F469478332 /* FBSnapshotTestCase.m in Sources */ = {isa = PBXBuildFile; fileRef = 277B6BE10C665F515606A22FD60C6DCC /* FBSnapshotTestCase.m */; }; | ||
| 29 | 8224CAD418F15FCAF5EB640475575EF4 /* Person.h in Headers */ = {isa = PBXBuildFile; fileRef = 0067B4E0620C1E4168F53ACDCB01D13E /* Person.h */; settings = {ATTRIBUTES = (Public, ); }; }; | ||
| 30 | 875A310EAF4D0C136C3FFFF5E0335BE4 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1DA24A38BA9EE106B59E3D4C8DD1CE0E /* UIKit.framework */; }; | ||
| 31 | 8AE19756F0126FE92AF625E36F3D70FE /* UIImage+Compare.h in Headers */ = {isa = PBXBuildFile; fileRef = 656116C8FA5458F45D4707110C9530EC /* UIImage+Compare.h */; settings = {ATTRIBUTES = (Private, ); }; }; | ||
| 32 | 93A9FB7F8DE53E6A4F9145DF40A9ABE5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 57221B54D014471C3D3E1925EFC917C8 /* Foundation.framework */; }; | ||
| 33 | 96186BA655BC442BFF36B765A5B996C9 /* Pods-JCategoryKit_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B5C20569EF275281610625FFB11E5763 /* Pods-JCategoryKit_Tests-dummy.m */; }; | ||
| 34 | 9D3C5E2F56838937146191468A893244 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E658F388F01C72599CA75537950B6095 /* XCTest.framework */; }; | ||
| 35 | B10C732D4829ACFDF3162320D14A3FF4 /* Person.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F89D9D301449890D127D759E515AA24 /* Person.m */; }; | ||
| 36 | B52281F9F4340D4FC8ABB2FEB1FEC08E /* UIImage+Compare.m in Sources */ = {isa = PBXBuildFile; fileRef = 235A78CFFA6D8B8D86CACD733531CB13 /* UIImage+Compare.m */; }; | ||
| 37 | C18038478633F9785EEBEE01FA1636C3 /* Pods-JCategoryKit_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 530A016B1553D1C7D5280DD814EF0E5C /* Pods-JCategoryKit_Example-dummy.m */; }; | ||
| 38 | C390C6005353FB986CB52F474CEF8588 /* FBSnapshotTestController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E1B7EA746BF6557FD565BAE12AF9198 /* FBSnapshotTestController.m */; }; | ||
| 39 | C9F76407497DF0205D7460B36D22259F /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3280BB5E7B57C31D41117A74F76E9DF3 /* QuartzCore.framework */; }; | ||
| 40 | CA54C09A12400567AFFCB407EEB7E154 /* UIImage+Diff.m in Sources */ = {isa = PBXBuildFile; fileRef = 4568279DE47DC3AB91598E1317503995 /* UIImage+Diff.m */; }; | ||
| 41 | FF8307B7346F4D3BA13C11AECFE6EDD0 /* FBSnapshotTestCase.h in Headers */ = {isa = PBXBuildFile; fileRef = FEE661E58CA6655B39AA49AA4C021C33 /* FBSnapshotTestCase.h */; settings = {ATTRIBUTES = (Public, ); }; }; | ||
| 42 | /* End PBXBuildFile section */ | ||
| 43 | |||
| 44 | /* Begin PBXContainerItemProxy section */ | ||
| 45 | 13A716B1156C45AE995D24E478E19272 /* PBXContainerItemProxy */ = { | ||
| 46 | isa = PBXContainerItemProxy; | ||
| 47 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; | ||
| 48 | proxyType = 1; | ||
| 49 | remoteGlobalIDString = 98A98149697C80CEF8D5772791E92E66; | ||
| 50 | remoteInfo = FBSnapshotTestCase; | ||
| 51 | }; | ||
| 52 | 4CAC3E82F5E0677718ABB7C8859E178B /* PBXContainerItemProxy */ = { | ||
| 53 | isa = PBXContainerItemProxy; | ||
| 54 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; | ||
| 55 | proxyType = 1; | ||
| 56 | remoteGlobalIDString = 9194957B171ABDD1325D09DCDB3F7853; | ||
| 57 | remoteInfo = JCategoryKit; | ||
| 58 | }; | ||
| 59 | 6EE343F8BF4D8337D9FF4BE43FCA5B5A /* PBXContainerItemProxy */ = { | ||
| 60 | isa = PBXContainerItemProxy; | ||
| 61 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; | ||
| 62 | proxyType = 1; | ||
| 63 | remoteGlobalIDString = 89FF20DFD77917C56542F2A1165780B9; | ||
| 64 | remoteInfo = "Pods-JCategoryKit_Example"; | ||
| 65 | }; | ||
| 66 | /* End PBXContainerItemProxy section */ | ||
| 67 | |||
| 68 | /* Begin PBXFileReference section */ | ||
| 69 | 0067B4E0620C1E4168F53ACDCB01D13E /* Person.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = Person.h; path = JCategoryKit/Classes/Person.h; sourceTree = "<group>"; }; | ||
| 70 | 0A7811A013D5E2B56B7D15A742EE5242 /* Pods-JCategoryKit_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-JCategoryKit_Example-umbrella.h"; sourceTree = "<group>"; }; | ||
| 71 | 0F538C426803AE34255FC6E35B408CCA /* UIApplication+StrictKeyWindow.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIApplication+StrictKeyWindow.m"; path = "FBSnapshotTestCase/Categories/UIApplication+StrictKeyWindow.m"; sourceTree = "<group>"; }; | ||
| 72 | 18EA9877485F4CAB556E863AE7756146 /* Pods-JCategoryKit_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-JCategoryKit_Tests-umbrella.h"; sourceTree = "<group>"; }; | ||
| 73 | 1ADA6E655DC84D06359BD0ED5E36C783 /* FBSnapshotTestCase-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "FBSnapshotTestCase-dummy.m"; sourceTree = "<group>"; }; | ||
| 74 | 1DA24A38BA9EE106B59E3D4C8DD1CE0E /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; | ||
| 75 | 1F89D9D301449890D127D759E515AA24 /* Person.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = Person.m; path = JCategoryKit/Classes/Person.m; sourceTree = "<group>"; }; | ||
| 76 | 2009675189BDDC7B68A826AC8128F2EF /* JCategoryKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "JCategoryKit-prefix.pch"; sourceTree = "<group>"; }; | ||
| 77 | 235A78CFFA6D8B8D86CACD733531CB13 /* UIImage+Compare.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Compare.m"; path = "FBSnapshotTestCase/Categories/UIImage+Compare.m"; sourceTree = "<group>"; }; | ||
| 78 | 25058F6BDCA0C96A7C5542322D6158E5 /* JCategoryKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "JCategoryKit-dummy.m"; sourceTree = "<group>"; }; | ||
| 79 | 277B6BE10C665F515606A22FD60C6DCC /* FBSnapshotTestCase.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestCase.m; path = FBSnapshotTestCase/FBSnapshotTestCase.m; sourceTree = "<group>"; }; | ||
| 80 | 284833D18C244D2B42966B6EE425AA59 /* UIImage+Snapshot.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Snapshot.h"; path = "FBSnapshotTestCase/Categories/UIImage+Snapshot.h"; sourceTree = "<group>"; }; | ||
| 81 | 2ACFBD46D02FBEBF723C920501DEC39F /* Pods-JCategoryKit_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-JCategoryKit_Example-acknowledgements.markdown"; sourceTree = "<group>"; }; | ||
| 82 | 3280BB5E7B57C31D41117A74F76E9DF3 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; | ||
| 83 | 389FA9F5074C9D4136215D226608449B /* Pods-JCategoryKit_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-JCategoryKit_Example-acknowledgements.plist"; sourceTree = "<group>"; }; | ||
| 84 | 3C3FEFACA643AF8D43792C15DE202DA5 /* JCategoryKit.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = JCategoryKit.debug.xcconfig; sourceTree = "<group>"; }; | ||
| 85 | 3F0D66CF296ABBC57EC4D0452397E235 /* SwiftSupport.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SwiftSupport.swift; path = FBSnapshotTestCase/SwiftSupport.swift; sourceTree = "<group>"; }; | ||
| 86 | 44A51B8AB5F581E95018404624DA6027 /* Pods-JCategoryKit_Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-JCategoryKit_Example-Info.plist"; sourceTree = "<group>"; }; | ||
| 87 | 4568279DE47DC3AB91598E1317503995 /* UIImage+Diff.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Diff.m"; path = "FBSnapshotTestCase/Categories/UIImage+Diff.m"; sourceTree = "<group>"; }; | ||
| 88 | 48AAF2BC3C1305701486AB0C3A57E7C2 /* Pods-JCategoryKit_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JCategoryKit_Example.debug.xcconfig"; sourceTree = "<group>"; }; | ||
| 89 | 4C6513B09838318BD763CFD5390D1DE0 /* FBSnapshotTestCase.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FBSnapshotTestCase.release.xcconfig; sourceTree = "<group>"; }; | ||
| 90 | 52A0DD7D517C8CA97519396C08EF2C83 /* Pods-JCategoryKit_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JCategoryKit_Tests.release.xcconfig"; sourceTree = "<group>"; }; | ||
| 91 | 530A016B1553D1C7D5280DD814EF0E5C /* Pods-JCategoryKit_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-JCategoryKit_Example-dummy.m"; sourceTree = "<group>"; }; | ||
| 92 | 553E26DD3024547110D24EA588D7741F /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = "<group>"; }; | ||
| 93 | 5620CCE2A9810C085DFE0B5A58131DB9 /* JCategoryKit.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = JCategoryKit.release.xcconfig; sourceTree = "<group>"; }; | ||
| 94 | 57221B54D014471C3D3E1925EFC917C8 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; | ||
| 95 | 5824C3B2567490C69753CDF1904EAE58 /* JCategoryKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "JCategoryKit-umbrella.h"; sourceTree = "<group>"; }; | ||
| 96 | 5C4F31330DFA99D699E4BDC8C3573D73 /* FBSnapshotTestCase */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = FBSnapshotTestCase; path = FBSnapshotTestCase.framework; sourceTree = BUILT_PRODUCTS_DIR; }; | ||
| 97 | 6464247BD0DE096C0CD0521C092EBE23 /* Pods-JCategoryKit_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-JCategoryKit_Tests.modulemap"; sourceTree = "<group>"; }; | ||
| 98 | 656116C8FA5458F45D4707110C9530EC /* UIImage+Compare.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Compare.h"; path = "FBSnapshotTestCase/Categories/UIImage+Compare.h"; sourceTree = "<group>"; }; | ||
| 99 | 673E6D8309EB7D55EC873FBAC2312B1F /* Pods-JCategoryKit_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JCategoryKit_Example.release.xcconfig"; sourceTree = "<group>"; }; | ||
| 100 | 6ABB3EB3CCC5BCA82F40FE8DC87BB778 /* FBSnapshotTestCasePlatform.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestCasePlatform.m; path = FBSnapshotTestCase/FBSnapshotTestCasePlatform.m; sourceTree = "<group>"; }; | ||
| 101 | 76DB4C0E3A93456EB716EE5C0133CD16 /* Pods-JCategoryKit_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-JCategoryKit_Tests-acknowledgements.markdown"; sourceTree = "<group>"; }; | ||
| 102 | 7E1B7EA746BF6557FD565BAE12AF9198 /* FBSnapshotTestController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = FBSnapshotTestController.m; path = FBSnapshotTestCase/FBSnapshotTestController.m; sourceTree = "<group>"; }; | ||
| 103 | 83A0B73C64C758A82600FEF5E33D339C /* Pods-JCategoryKit_Example */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-JCategoryKit_Example"; path = Pods_JCategoryKit_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; | ||
| 104 | 88B1DEEBF6316A84D7413645212492FF /* FBSnapshotTestCasePlatform.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestCasePlatform.h; path = FBSnapshotTestCase/FBSnapshotTestCasePlatform.h; sourceTree = "<group>"; }; | ||
| 105 | 8A4E9BA99A4F908192B73DF7301682F9 /* Pods-JCategoryKit_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-JCategoryKit_Example.modulemap"; sourceTree = "<group>"; }; | ||
| 106 | 8E5923010B02074CAA9AAF6EA02D66AA /* FBSnapshotTestCase-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FBSnapshotTestCase-umbrella.h"; sourceTree = "<group>"; }; | ||
| 107 | 938FCD93D79FC203CD9381005C010EA0 /* Pods-JCategoryKit_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-JCategoryKit_Tests-acknowledgements.plist"; sourceTree = "<group>"; }; | ||
| 108 | 9468E867498BBAF36F9AFFE4845F8B09 /* FBSnapshotTestCase.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = FBSnapshotTestCase.debug.xcconfig; sourceTree = "<group>"; }; | ||
| 109 | 96187BF3038121CC146335E9FF0B0AFF /* UIImage+Diff.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+Diff.h"; path = "FBSnapshotTestCase/Categories/UIImage+Diff.h"; sourceTree = "<group>"; }; | ||
| 110 | 99A67367E018411D614EC8536A8A1C5B /* UIApplication+StrictKeyWindow.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIApplication+StrictKeyWindow.h"; path = "FBSnapshotTestCase/Categories/UIApplication+StrictKeyWindow.h"; sourceTree = "<group>"; }; | ||
| 111 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; | ||
| 112 | A1B9CCF123884BD6448F60B596D746D8 /* Pods-JCategoryKit_Tests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-JCategoryKit_Tests-Info.plist"; sourceTree = "<group>"; }; | ||
| 113 | A3A80B761B3FC8698E93503FA319BE38 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = "<group>"; }; | ||
| 114 | AE9FF9459FBCDC4AF88FB6B5A4CC1439 /* FBSnapshotTestController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestController.h; path = FBSnapshotTestCase/FBSnapshotTestController.h; sourceTree = "<group>"; }; | ||
| 115 | B31CF0131B23781BC1FF20A00713B5F5 /* JCategoryKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = JCategoryKit.modulemap; sourceTree = "<group>"; }; | ||
| 116 | B5C20569EF275281610625FFB11E5763 /* Pods-JCategoryKit_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-JCategoryKit_Tests-dummy.m"; sourceTree = "<group>"; }; | ||
| 117 | B7103CA00AED20722C5B69CA5B4F6938 /* FBSnapshotTestCase-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "FBSnapshotTestCase-Info.plist"; sourceTree = "<group>"; }; | ||
| 118 | B943F9244637A6A5CFB93CC665A2BDBB /* Pods-JCategoryKit_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-JCategoryKit_Tests.debug.xcconfig"; sourceTree = "<group>"; }; | ||
| 119 | BF2C718BE851FA5BD1F7551F0AD27033 /* JCategoryKit */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = JCategoryKit; path = JCategoryKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; | ||
| 120 | C33D634CF8049B0A3B8F5F0E6800FA93 /* JCategoryKit.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = JCategoryKit.podspec; sourceTree = "<group>"; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; | ||
| 121 | CBFF6C5FD9C3A84274A9314D3E940B6E /* FBSnapshotTestCase.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = FBSnapshotTestCase.modulemap; sourceTree = "<group>"; }; | ||
| 122 | D08CEBB9BDD9EF7A662ECFC0305C169E /* FBSnapshotTestCase-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "FBSnapshotTestCase-prefix.pch"; sourceTree = "<group>"; }; | ||
| 123 | D872A3EE224412D4057C234FBC629F9C /* UIImage+Snapshot.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+Snapshot.m"; path = "FBSnapshotTestCase/Categories/UIImage+Snapshot.m"; sourceTree = "<group>"; }; | ||
| 124 | DD912B87B3C44D656ADC7E78D544DFCC /* Pods-JCategoryKit_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-JCategoryKit_Example-frameworks.sh"; sourceTree = "<group>"; }; | ||
| 125 | E658F388F01C72599CA75537950B6095 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; | ||
| 126 | EC8736C07576D78F9082B5B9898B9F68 /* JCategoryKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "JCategoryKit-Info.plist"; sourceTree = "<group>"; }; | ||
| 127 | F6E92B3F78CDD5AF08F7023328BB3C2A /* Pods-JCategoryKit_Tests */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-JCategoryKit_Tests"; path = Pods_JCategoryKit_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; | ||
| 128 | FA461C817945187E0AC5E6EC26CE939E /* Pods-JCategoryKit_Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-JCategoryKit_Tests-frameworks.sh"; sourceTree = "<group>"; }; | ||
| 129 | FEE661E58CA6655B39AA49AA4C021C33 /* FBSnapshotTestCase.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = FBSnapshotTestCase.h; path = FBSnapshotTestCase/FBSnapshotTestCase.h; sourceTree = "<group>"; }; | ||
| 130 | /* End PBXFileReference section */ | ||
| 131 | |||
| 132 | /* Begin PBXFrameworksBuildPhase section */ | ||
| 133 | 3768BCD0F3C2DEB17EBA9C0F42175BA2 /* Frameworks */ = { | ||
| 134 | isa = PBXFrameworksBuildPhase; | ||
| 135 | buildActionMask = 2147483647; | ||
| 136 | files = ( | ||
| 137 | 539D867D3777C433A977FDBD94DCB65F /* Foundation.framework in Frameworks */, | ||
| 138 | ); | ||
| 139 | runOnlyForDeploymentPostprocessing = 0; | ||
| 140 | }; | ||
| 141 | 8DE5E5C03B456F222368704F16E198D1 /* Frameworks */ = { | ||
| 142 | isa = PBXFrameworksBuildPhase; | ||
| 143 | buildActionMask = 2147483647; | ||
| 144 | files = ( | ||
| 145 | 93A9FB7F8DE53E6A4F9145DF40A9ABE5 /* Foundation.framework in Frameworks */, | ||
| 146 | ); | ||
| 147 | runOnlyForDeploymentPostprocessing = 0; | ||
| 148 | }; | ||
| 149 | B0E2CC050D6A4647750CF8198310E99A /* Frameworks */ = { | ||
| 150 | isa = PBXFrameworksBuildPhase; | ||
| 151 | buildActionMask = 2147483647; | ||
| 152 | files = ( | ||
| 153 | 04DE749AC277F07A69D6AF304E06D6FA /* Foundation.framework in Frameworks */, | ||
| 154 | ); | ||
| 155 | runOnlyForDeploymentPostprocessing = 0; | ||
| 156 | }; | ||
| 157 | E3B880388FF17A336FBF90E30E537508 /* Frameworks */ = { | ||
| 158 | isa = PBXFrameworksBuildPhase; | ||
| 159 | buildActionMask = 2147483647; | ||
| 160 | files = ( | ||
| 161 | 2ECCAC52EF4C74E1032E0BC646BBE5B9 /* Foundation.framework in Frameworks */, | ||
| 162 | C9F76407497DF0205D7460B36D22259F /* QuartzCore.framework in Frameworks */, | ||
| 163 | 875A310EAF4D0C136C3FFFF5E0335BE4 /* UIKit.framework in Frameworks */, | ||
| 164 | 9D3C5E2F56838937146191468A893244 /* XCTest.framework in Frameworks */, | ||
| 165 | ); | ||
| 166 | runOnlyForDeploymentPostprocessing = 0; | ||
| 167 | }; | ||
| 168 | /* End PBXFrameworksBuildPhase section */ | ||
| 169 | |||
| 170 | /* Begin PBXGroup section */ | ||
| 171 | 1555887585EF99A17BE4FD18BE2E9C1F /* Pods-JCategoryKit_Example */ = { | ||
| 172 | isa = PBXGroup; | ||
| 173 | children = ( | ||
| 174 | 8A4E9BA99A4F908192B73DF7301682F9 /* Pods-JCategoryKit_Example.modulemap */, | ||
| 175 | 2ACFBD46D02FBEBF723C920501DEC39F /* Pods-JCategoryKit_Example-acknowledgements.markdown */, | ||
| 176 | 389FA9F5074C9D4136215D226608449B /* Pods-JCategoryKit_Example-acknowledgements.plist */, | ||
| 177 | 530A016B1553D1C7D5280DD814EF0E5C /* Pods-JCategoryKit_Example-dummy.m */, | ||
| 178 | DD912B87B3C44D656ADC7E78D544DFCC /* Pods-JCategoryKit_Example-frameworks.sh */, | ||
| 179 | 44A51B8AB5F581E95018404624DA6027 /* Pods-JCategoryKit_Example-Info.plist */, | ||
| 180 | 0A7811A013D5E2B56B7D15A742EE5242 /* Pods-JCategoryKit_Example-umbrella.h */, | ||
| 181 | 48AAF2BC3C1305701486AB0C3A57E7C2 /* Pods-JCategoryKit_Example.debug.xcconfig */, | ||
| 182 | 673E6D8309EB7D55EC873FBAC2312B1F /* Pods-JCategoryKit_Example.release.xcconfig */, | ||
| 183 | ); | ||
| 184 | name = "Pods-JCategoryKit_Example"; | ||
| 185 | path = "Target Support Files/Pods-JCategoryKit_Example"; | ||
| 186 | sourceTree = "<group>"; | ||
| 187 | }; | ||
| 188 | 401818139EC4C2D51045768A322F152F /* Pod */ = { | ||
| 189 | isa = PBXGroup; | ||
| 190 | children = ( | ||
| 191 | C33D634CF8049B0A3B8F5F0E6800FA93 /* JCategoryKit.podspec */, | ||
| 192 | A3A80B761B3FC8698E93503FA319BE38 /* LICENSE */, | ||
| 193 | 553E26DD3024547110D24EA588D7741F /* README.md */, | ||
| 194 | ); | ||
| 195 | name = Pod; | ||
| 196 | sourceTree = "<group>"; | ||
| 197 | }; | ||
| 198 | 491B180CF0363F7FB0F440F6B4A13728 /* JCategoryKit */ = { | ||
| 199 | isa = PBXGroup; | ||
| 200 | children = ( | ||
| 201 | 0067B4E0620C1E4168F53ACDCB01D13E /* Person.h */, | ||
| 202 | 1F89D9D301449890D127D759E515AA24 /* Person.m */, | ||
| 203 | 401818139EC4C2D51045768A322F152F /* Pod */, | ||
| 204 | 5AA2942EA05AFFC5116F6687ED630FB4 /* Support Files */, | ||
| 205 | ); | ||
| 206 | name = JCategoryKit; | ||
| 207 | path = ../..; | ||
| 208 | sourceTree = "<group>"; | ||
| 209 | }; | ||
| 210 | 49B503DB96FFBB13896F26B44054DF66 /* Development Pods */ = { | ||
| 211 | isa = PBXGroup; | ||
| 212 | children = ( | ||
| 213 | 491B180CF0363F7FB0F440F6B4A13728 /* JCategoryKit */, | ||
| 214 | ); | ||
| 215 | name = "Development Pods"; | ||
| 216 | sourceTree = "<group>"; | ||
| 217 | }; | ||
| 218 | 4BA2479549DD918290454B1CDCD0B92B /* Core */ = { | ||
| 219 | isa = PBXGroup; | ||
| 220 | children = ( | ||
| 221 | FEE661E58CA6655B39AA49AA4C021C33 /* FBSnapshotTestCase.h */, | ||
| 222 | 277B6BE10C665F515606A22FD60C6DCC /* FBSnapshotTestCase.m */, | ||
| 223 | 88B1DEEBF6316A84D7413645212492FF /* FBSnapshotTestCasePlatform.h */, | ||
| 224 | 6ABB3EB3CCC5BCA82F40FE8DC87BB778 /* FBSnapshotTestCasePlatform.m */, | ||
| 225 | AE9FF9459FBCDC4AF88FB6B5A4CC1439 /* FBSnapshotTestController.h */, | ||
| 226 | 7E1B7EA746BF6557FD565BAE12AF9198 /* FBSnapshotTestController.m */, | ||
| 227 | 99A67367E018411D614EC8536A8A1C5B /* UIApplication+StrictKeyWindow.h */, | ||
| 228 | 0F538C426803AE34255FC6E35B408CCA /* UIApplication+StrictKeyWindow.m */, | ||
| 229 | 656116C8FA5458F45D4707110C9530EC /* UIImage+Compare.h */, | ||
| 230 | 235A78CFFA6D8B8D86CACD733531CB13 /* UIImage+Compare.m */, | ||
| 231 | 96187BF3038121CC146335E9FF0B0AFF /* UIImage+Diff.h */, | ||
| 232 | 4568279DE47DC3AB91598E1317503995 /* UIImage+Diff.m */, | ||
| 233 | 284833D18C244D2B42966B6EE425AA59 /* UIImage+Snapshot.h */, | ||
| 234 | D872A3EE224412D4057C234FBC629F9C /* UIImage+Snapshot.m */, | ||
| 235 | ); | ||
| 236 | name = Core; | ||
| 237 | sourceTree = "<group>"; | ||
| 238 | }; | ||
| 239 | 5AA2942EA05AFFC5116F6687ED630FB4 /* Support Files */ = { | ||
| 240 | isa = PBXGroup; | ||
| 241 | children = ( | ||
| 242 | B31CF0131B23781BC1FF20A00713B5F5 /* JCategoryKit.modulemap */, | ||
| 243 | 25058F6BDCA0C96A7C5542322D6158E5 /* JCategoryKit-dummy.m */, | ||
| 244 | EC8736C07576D78F9082B5B9898B9F68 /* JCategoryKit-Info.plist */, | ||
| 245 | 2009675189BDDC7B68A826AC8128F2EF /* JCategoryKit-prefix.pch */, | ||
| 246 | 5824C3B2567490C69753CDF1904EAE58 /* JCategoryKit-umbrella.h */, | ||
| 247 | 3C3FEFACA643AF8D43792C15DE202DA5 /* JCategoryKit.debug.xcconfig */, | ||
| 248 | 5620CCE2A9810C085DFE0B5A58131DB9 /* JCategoryKit.release.xcconfig */, | ||
| 249 | ); | ||
| 250 | name = "Support Files"; | ||
| 251 | path = "Example/Pods/Target Support Files/JCategoryKit"; | ||
| 252 | sourceTree = "<group>"; | ||
| 253 | }; | ||
| 254 | 61E208D3BECCC1F10EA99C5A6AE31606 /* Products */ = { | ||
| 255 | isa = PBXGroup; | ||
| 256 | children = ( | ||
| 257 | 5C4F31330DFA99D699E4BDC8C3573D73 /* FBSnapshotTestCase */, | ||
| 258 | BF2C718BE851FA5BD1F7551F0AD27033 /* JCategoryKit */, | ||
| 259 | 83A0B73C64C758A82600FEF5E33D339C /* Pods-JCategoryKit_Example */, | ||
| 260 | F6E92B3F78CDD5AF08F7023328BB3C2A /* Pods-JCategoryKit_Tests */, | ||
| 261 | ); | ||
| 262 | name = Products; | ||
| 263 | sourceTree = "<group>"; | ||
| 264 | }; | ||
| 265 | 906402ECC4C6C5EB58DD365FD2C64E92 /* SwiftSupport */ = { | ||
| 266 | isa = PBXGroup; | ||
| 267 | children = ( | ||
| 268 | 3F0D66CF296ABBC57EC4D0452397E235 /* SwiftSupport.swift */, | ||
| 269 | ); | ||
| 270 | name = SwiftSupport; | ||
| 271 | sourceTree = "<group>"; | ||
| 272 | }; | ||
| 273 | 997049CEA4B32BC9E6FA98806E0BF915 /* Targets Support Files */ = { | ||
| 274 | isa = PBXGroup; | ||
| 275 | children = ( | ||
| 276 | 1555887585EF99A17BE4FD18BE2E9C1F /* Pods-JCategoryKit_Example */, | ||
| 277 | E337DA29FECA5B42583E1DA5BB2E7DB6 /* Pods-JCategoryKit_Tests */, | ||
| 278 | ); | ||
| 279 | name = "Targets Support Files"; | ||
| 280 | sourceTree = "<group>"; | ||
| 281 | }; | ||
| 282 | B69B2ECE2D2C9A3924A9231138CE0BBC /* Support Files */ = { | ||
| 283 | isa = PBXGroup; | ||
| 284 | children = ( | ||
| 285 | CBFF6C5FD9C3A84274A9314D3E940B6E /* FBSnapshotTestCase.modulemap */, | ||
| 286 | 1ADA6E655DC84D06359BD0ED5E36C783 /* FBSnapshotTestCase-dummy.m */, | ||
| 287 | B7103CA00AED20722C5B69CA5B4F6938 /* FBSnapshotTestCase-Info.plist */, | ||
| 288 | D08CEBB9BDD9EF7A662ECFC0305C169E /* FBSnapshotTestCase-prefix.pch */, | ||
| 289 | 8E5923010B02074CAA9AAF6EA02D66AA /* FBSnapshotTestCase-umbrella.h */, | ||
| 290 | 9468E867498BBAF36F9AFFE4845F8B09 /* FBSnapshotTestCase.debug.xcconfig */, | ||
| 291 | 4C6513B09838318BD763CFD5390D1DE0 /* FBSnapshotTestCase.release.xcconfig */, | ||
| 292 | ); | ||
| 293 | name = "Support Files"; | ||
| 294 | path = "../Target Support Files/FBSnapshotTestCase"; | ||
| 295 | sourceTree = "<group>"; | ||
| 296 | }; | ||
| 297 | BA4F31F07263C99FC76E66D632A59F09 /* Frameworks */ = { | ||
| 298 | isa = PBXGroup; | ||
| 299 | children = ( | ||
| 300 | FB2668559AE577E6E8078C0C291AD417 /* iOS */, | ||
| 301 | ); | ||
| 302 | name = Frameworks; | ||
| 303 | sourceTree = "<group>"; | ||
| 304 | }; | ||
| 305 | BD2D60DE56CBB8C87BA07E0C1CCD0592 /* FBSnapshotTestCase */ = { | ||
| 306 | isa = PBXGroup; | ||
| 307 | children = ( | ||
| 308 | 4BA2479549DD918290454B1CDCD0B92B /* Core */, | ||
| 309 | B69B2ECE2D2C9A3924A9231138CE0BBC /* Support Files */, | ||
| 310 | 906402ECC4C6C5EB58DD365FD2C64E92 /* SwiftSupport */, | ||
| 311 | ); | ||
| 312 | name = FBSnapshotTestCase; | ||
| 313 | path = FBSnapshotTestCase; | ||
| 314 | sourceTree = "<group>"; | ||
| 315 | }; | ||
| 316 | CF1408CF629C7361332E53B88F7BD30C = { | ||
| 317 | isa = PBXGroup; | ||
| 318 | children = ( | ||
| 319 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, | ||
| 320 | 49B503DB96FFBB13896F26B44054DF66 /* Development Pods */, | ||
| 321 | BA4F31F07263C99FC76E66D632A59F09 /* Frameworks */, | ||
| 322 | E81A37DBDE41E671312C56736544E2FA /* Pods */, | ||
| 323 | 61E208D3BECCC1F10EA99C5A6AE31606 /* Products */, | ||
| 324 | 997049CEA4B32BC9E6FA98806E0BF915 /* Targets Support Files */, | ||
| 325 | ); | ||
| 326 | sourceTree = "<group>"; | ||
| 327 | }; | ||
| 328 | E337DA29FECA5B42583E1DA5BB2E7DB6 /* Pods-JCategoryKit_Tests */ = { | ||
| 329 | isa = PBXGroup; | ||
| 330 | children = ( | ||
| 331 | 6464247BD0DE096C0CD0521C092EBE23 /* Pods-JCategoryKit_Tests.modulemap */, | ||
| 332 | 76DB4C0E3A93456EB716EE5C0133CD16 /* Pods-JCategoryKit_Tests-acknowledgements.markdown */, | ||
| 333 | 938FCD93D79FC203CD9381005C010EA0 /* Pods-JCategoryKit_Tests-acknowledgements.plist */, | ||
| 334 | B5C20569EF275281610625FFB11E5763 /* Pods-JCategoryKit_Tests-dummy.m */, | ||
| 335 | FA461C817945187E0AC5E6EC26CE939E /* Pods-JCategoryKit_Tests-frameworks.sh */, | ||
| 336 | A1B9CCF123884BD6448F60B596D746D8 /* Pods-JCategoryKit_Tests-Info.plist */, | ||
| 337 | 18EA9877485F4CAB556E863AE7756146 /* Pods-JCategoryKit_Tests-umbrella.h */, | ||
| 338 | B943F9244637A6A5CFB93CC665A2BDBB /* Pods-JCategoryKit_Tests.debug.xcconfig */, | ||
| 339 | 52A0DD7D517C8CA97519396C08EF2C83 /* Pods-JCategoryKit_Tests.release.xcconfig */, | ||
| 340 | ); | ||
| 341 | name = "Pods-JCategoryKit_Tests"; | ||
| 342 | path = "Target Support Files/Pods-JCategoryKit_Tests"; | ||
| 343 | sourceTree = "<group>"; | ||
| 344 | }; | ||
| 345 | E81A37DBDE41E671312C56736544E2FA /* Pods */ = { | ||
| 346 | isa = PBXGroup; | ||
| 347 | children = ( | ||
| 348 | BD2D60DE56CBB8C87BA07E0C1CCD0592 /* FBSnapshotTestCase */, | ||
| 349 | ); | ||
| 350 | name = Pods; | ||
| 351 | sourceTree = "<group>"; | ||
| 352 | }; | ||
| 353 | FB2668559AE577E6E8078C0C291AD417 /* iOS */ = { | ||
| 354 | isa = PBXGroup; | ||
| 355 | children = ( | ||
| 356 | 57221B54D014471C3D3E1925EFC917C8 /* Foundation.framework */, | ||
| 357 | 3280BB5E7B57C31D41117A74F76E9DF3 /* QuartzCore.framework */, | ||
| 358 | 1DA24A38BA9EE106B59E3D4C8DD1CE0E /* UIKit.framework */, | ||
| 359 | E658F388F01C72599CA75537950B6095 /* XCTest.framework */, | ||
| 360 | ); | ||
| 361 | name = iOS; | ||
| 362 | sourceTree = "<group>"; | ||
| 363 | }; | ||
| 364 | /* End PBXGroup section */ | ||
| 365 | |||
| 366 | /* Begin PBXHeadersBuildPhase section */ | ||
| 367 | 39F99007BDAAE787CC848B21939275A3 /* Headers */ = { | ||
| 368 | isa = PBXHeadersBuildPhase; | ||
| 369 | buildActionMask = 2147483647; | ||
| 370 | files = ( | ||
| 371 | 7AD0FD677AAD06ABCA1B7926BC18E140 /* Pods-JCategoryKit_Tests-umbrella.h in Headers */, | ||
| 372 | ); | ||
| 373 | runOnlyForDeploymentPostprocessing = 0; | ||
| 374 | }; | ||
| 375 | 3C91A8D97FFCE3B2A73A4B667332979D /* Headers */ = { | ||
| 376 | isa = PBXHeadersBuildPhase; | ||
| 377 | buildActionMask = 2147483647; | ||
| 378 | files = ( | ||
| 379 | 29672FC10D2BAB45AA7C917EAEFEADA7 /* Pods-JCategoryKit_Example-umbrella.h in Headers */, | ||
| 380 | ); | ||
| 381 | runOnlyForDeploymentPostprocessing = 0; | ||
| 382 | }; | ||
| 383 | 50082F75C31CF1966F287A11835DFA02 /* Headers */ = { | ||
| 384 | isa = PBXHeadersBuildPhase; | ||
| 385 | buildActionMask = 2147483647; | ||
| 386 | files = ( | ||
| 387 | 4EA5082D8AFD068CBCA52EA79768584E /* JCategoryKit-umbrella.h in Headers */, | ||
| 388 | 8224CAD418F15FCAF5EB640475575EF4 /* Person.h in Headers */, | ||
| 389 | ); | ||
| 390 | runOnlyForDeploymentPostprocessing = 0; | ||
| 391 | }; | ||
| 392 | D4CF7A53AFE8275DDE075747E8245F97 /* Headers */ = { | ||
| 393 | isa = PBXHeadersBuildPhase; | ||
| 394 | buildActionMask = 2147483647; | ||
| 395 | files = ( | ||
| 396 | FF8307B7346F4D3BA13C11AECFE6EDD0 /* FBSnapshotTestCase.h in Headers */, | ||
| 397 | 1F84FE646CD1D7BAFFB58C243277AFF8 /* FBSnapshotTestCase-umbrella.h in Headers */, | ||
| 398 | 640CCE9C3A28AA3CA15510899F9140EE /* FBSnapshotTestCasePlatform.h in Headers */, | ||
| 399 | 2B88C28DD20CBFA7B3AEB21A365197FE /* FBSnapshotTestController.h in Headers */, | ||
| 400 | 5558B876B579BC1E79BD3D2B19148329 /* UIApplication+StrictKeyWindow.h in Headers */, | ||
| 401 | 8AE19756F0126FE92AF625E36F3D70FE /* UIImage+Compare.h in Headers */, | ||
| 402 | 67F1963AA7C9EDB78127AD5F566A4949 /* UIImage+Diff.h in Headers */, | ||
| 403 | 373413256658309F9053CE22BF62077E /* UIImage+Snapshot.h in Headers */, | ||
| 404 | ); | ||
| 405 | runOnlyForDeploymentPostprocessing = 0; | ||
| 406 | }; | ||
| 407 | /* End PBXHeadersBuildPhase section */ | ||
| 408 | |||
| 409 | /* Begin PBXNativeTarget section */ | ||
| 410 | 89FF20DFD77917C56542F2A1165780B9 /* Pods-JCategoryKit_Example */ = { | ||
| 411 | isa = PBXNativeTarget; | ||
| 412 | buildConfigurationList = 92A2C15F0A5EC28B5334BF0558B58F78 /* Build configuration list for PBXNativeTarget "Pods-JCategoryKit_Example" */; | ||
| 413 | buildPhases = ( | ||
| 414 | 3C91A8D97FFCE3B2A73A4B667332979D /* Headers */, | ||
| 415 | 0543A90E755D16551135DBBB50E83F3D /* Sources */, | ||
| 416 | B0E2CC050D6A4647750CF8198310E99A /* Frameworks */, | ||
| 417 | 0F55A17119B49E3E3DA4AD7CE03BC7DB /* Resources */, | ||
| 418 | ); | ||
| 419 | buildRules = ( | ||
| 420 | ); | ||
| 421 | dependencies = ( | ||
| 422 | 822EBC7784E7CFF3DB57B191D03AFBE9 /* PBXTargetDependency */, | ||
| 423 | ); | ||
| 424 | name = "Pods-JCategoryKit_Example"; | ||
| 425 | productName = Pods_JCategoryKit_Example; | ||
| 426 | productReference = 83A0B73C64C758A82600FEF5E33D339C /* Pods-JCategoryKit_Example */; | ||
| 427 | productType = "com.apple.product-type.framework"; | ||
| 428 | }; | ||
| 429 | 9194957B171ABDD1325D09DCDB3F7853 /* JCategoryKit */ = { | ||
| 430 | isa = PBXNativeTarget; | ||
| 431 | buildConfigurationList = 817037DAB64C8B45390E2F1684C6657E /* Build configuration list for PBXNativeTarget "JCategoryKit" */; | ||
| 432 | buildPhases = ( | ||
| 433 | 50082F75C31CF1966F287A11835DFA02 /* Headers */, | ||
| 434 | 513FF1F753DA24ACE1434A5A9C7D922B /* Sources */, | ||
| 435 | 8DE5E5C03B456F222368704F16E198D1 /* Frameworks */, | ||
| 436 | 427D58CF82B54ECF4CA6C495114770DD /* Resources */, | ||
| 437 | ); | ||
| 438 | buildRules = ( | ||
| 439 | ); | ||
| 440 | dependencies = ( | ||
| 441 | ); | ||
| 442 | name = JCategoryKit; | ||
| 443 | productName = JCategoryKit; | ||
| 444 | productReference = BF2C718BE851FA5BD1F7551F0AD27033 /* JCategoryKit */; | ||
| 445 | productType = "com.apple.product-type.framework"; | ||
| 446 | }; | ||
| 447 | 98A98149697C80CEF8D5772791E92E66 /* FBSnapshotTestCase */ = { | ||
| 448 | isa = PBXNativeTarget; | ||
| 449 | buildConfigurationList = 28DAA9880679133EC375B7072B9AEABB /* Build configuration list for PBXNativeTarget "FBSnapshotTestCase" */; | ||
| 450 | buildPhases = ( | ||
| 451 | D4CF7A53AFE8275DDE075747E8245F97 /* Headers */, | ||
| 452 | EE210BFC37CDBA0645C09C3819F41723 /* Sources */, | ||
| 453 | E3B880388FF17A336FBF90E30E537508 /* Frameworks */, | ||
| 454 | 194C9DCC4899F62F4FB7DDF15C987499 /* Resources */, | ||
| 455 | ); | ||
| 456 | buildRules = ( | ||
| 457 | ); | ||
| 458 | dependencies = ( | ||
| 459 | ); | ||
| 460 | name = FBSnapshotTestCase; | ||
| 461 | productName = FBSnapshotTestCase; | ||
| 462 | productReference = 5C4F31330DFA99D699E4BDC8C3573D73 /* FBSnapshotTestCase */; | ||
| 463 | productType = "com.apple.product-type.framework"; | ||
| 464 | }; | ||
| 465 | F35C2EEEEB27652E8F1D671F8A7E9E08 /* Pods-JCategoryKit_Tests */ = { | ||
| 466 | isa = PBXNativeTarget; | ||
| 467 | buildConfigurationList = 07F02FB7FC113439A52F6E94082A5A77 /* Build configuration list for PBXNativeTarget "Pods-JCategoryKit_Tests" */; | ||
| 468 | buildPhases = ( | ||
| 469 | 39F99007BDAAE787CC848B21939275A3 /* Headers */, | ||
| 470 | 00CB6660C624661DFF38721380816C51 /* Sources */, | ||
| 471 | 3768BCD0F3C2DEB17EBA9C0F42175BA2 /* Frameworks */, | ||
| 472 | BCF165EDDC53CFF68F7E51642BBCF988 /* Resources */, | ||
| 473 | ); | ||
| 474 | buildRules = ( | ||
| 475 | ); | ||
| 476 | dependencies = ( | ||
| 477 | 6048586FB694D0F4D109E4F24C236B37 /* PBXTargetDependency */, | ||
| 478 | 3AF61007514CF0AFCC7256532F9DE52B /* PBXTargetDependency */, | ||
| 479 | ); | ||
| 480 | name = "Pods-JCategoryKit_Tests"; | ||
| 481 | productName = Pods_JCategoryKit_Tests; | ||
| 482 | productReference = F6E92B3F78CDD5AF08F7023328BB3C2A /* Pods-JCategoryKit_Tests */; | ||
| 483 | productType = "com.apple.product-type.framework"; | ||
| 484 | }; | ||
| 485 | /* End PBXNativeTarget section */ | ||
| 486 | |||
| 487 | /* Begin PBXProject section */ | ||
| 488 | BFDFE7DC352907FC980B868725387E98 /* Project object */ = { | ||
| 489 | isa = PBXProject; | ||
| 490 | attributes = { | ||
| 491 | LastSwiftUpdateCheck = 1240; | ||
| 492 | LastUpgradeCheck = 1240; | ||
| 493 | }; | ||
| 494 | buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; | ||
| 495 | compatibilityVersion = "Xcode 3.2"; | ||
| 496 | developmentRegion = en; | ||
| 497 | hasScannedForEncodings = 0; | ||
| 498 | knownRegions = ( | ||
| 499 | Base, | ||
| 500 | en, | ||
| 501 | ); | ||
| 502 | mainGroup = CF1408CF629C7361332E53B88F7BD30C; | ||
| 503 | productRefGroup = 61E208D3BECCC1F10EA99C5A6AE31606 /* Products */; | ||
| 504 | projectDirPath = ""; | ||
| 505 | projectRoot = ""; | ||
| 506 | targets = ( | ||
| 507 | 98A98149697C80CEF8D5772791E92E66 /* FBSnapshotTestCase */, | ||
| 508 | 9194957B171ABDD1325D09DCDB3F7853 /* JCategoryKit */, | ||
| 509 | 89FF20DFD77917C56542F2A1165780B9 /* Pods-JCategoryKit_Example */, | ||
| 510 | F35C2EEEEB27652E8F1D671F8A7E9E08 /* Pods-JCategoryKit_Tests */, | ||
| 511 | ); | ||
| 512 | }; | ||
| 513 | /* End PBXProject section */ | ||
| 514 | |||
| 515 | /* Begin PBXResourcesBuildPhase section */ | ||
| 516 | 0F55A17119B49E3E3DA4AD7CE03BC7DB /* Resources */ = { | ||
| 517 | isa = PBXResourcesBuildPhase; | ||
| 518 | buildActionMask = 2147483647; | ||
| 519 | files = ( | ||
| 520 | ); | ||
| 521 | runOnlyForDeploymentPostprocessing = 0; | ||
| 522 | }; | ||
| 523 | 194C9DCC4899F62F4FB7DDF15C987499 /* Resources */ = { | ||
| 524 | isa = PBXResourcesBuildPhase; | ||
| 525 | buildActionMask = 2147483647; | ||
| 526 | files = ( | ||
| 527 | ); | ||
| 528 | runOnlyForDeploymentPostprocessing = 0; | ||
| 529 | }; | ||
| 530 | 427D58CF82B54ECF4CA6C495114770DD /* Resources */ = { | ||
| 531 | isa = PBXResourcesBuildPhase; | ||
| 532 | buildActionMask = 2147483647; | ||
| 533 | files = ( | ||
| 534 | ); | ||
| 535 | runOnlyForDeploymentPostprocessing = 0; | ||
| 536 | }; | ||
| 537 | BCF165EDDC53CFF68F7E51642BBCF988 /* Resources */ = { | ||
| 538 | isa = PBXResourcesBuildPhase; | ||
| 539 | buildActionMask = 2147483647; | ||
| 540 | files = ( | ||
| 541 | ); | ||
| 542 | runOnlyForDeploymentPostprocessing = 0; | ||
| 543 | }; | ||
| 544 | /* End PBXResourcesBuildPhase section */ | ||
| 545 | |||
| 546 | /* Begin PBXSourcesBuildPhase section */ | ||
| 547 | 00CB6660C624661DFF38721380816C51 /* Sources */ = { | ||
| 548 | isa = PBXSourcesBuildPhase; | ||
| 549 | buildActionMask = 2147483647; | ||
| 550 | files = ( | ||
| 551 | 96186BA655BC442BFF36B765A5B996C9 /* Pods-JCategoryKit_Tests-dummy.m in Sources */, | ||
| 552 | ); | ||
| 553 | runOnlyForDeploymentPostprocessing = 0; | ||
| 554 | }; | ||
| 555 | 0543A90E755D16551135DBBB50E83F3D /* Sources */ = { | ||
| 556 | isa = PBXSourcesBuildPhase; | ||
| 557 | buildActionMask = 2147483647; | ||
| 558 | files = ( | ||
| 559 | C18038478633F9785EEBEE01FA1636C3 /* Pods-JCategoryKit_Example-dummy.m in Sources */, | ||
| 560 | ); | ||
| 561 | runOnlyForDeploymentPostprocessing = 0; | ||
| 562 | }; | ||
| 563 | 513FF1F753DA24ACE1434A5A9C7D922B /* Sources */ = { | ||
| 564 | isa = PBXSourcesBuildPhase; | ||
| 565 | buildActionMask = 2147483647; | ||
| 566 | files = ( | ||
| 567 | 2101891E285D1927B7AB429B796A82AC /* JCategoryKit-dummy.m in Sources */, | ||
| 568 | B10C732D4829ACFDF3162320D14A3FF4 /* Person.m in Sources */, | ||
| 569 | ); | ||
| 570 | runOnlyForDeploymentPostprocessing = 0; | ||
| 571 | }; | ||
| 572 | EE210BFC37CDBA0645C09C3819F41723 /* Sources */ = { | ||
| 573 | isa = PBXSourcesBuildPhase; | ||
| 574 | buildActionMask = 2147483647; | ||
| 575 | files = ( | ||
| 576 | 7C67CBD15D9B5D0B7769B2F469478332 /* FBSnapshotTestCase.m in Sources */, | ||
| 577 | 5BE525FF6FA14B999ED2CCC0AA4FA0CF /* FBSnapshotTestCase-dummy.m in Sources */, | ||
| 578 | 30D475DF57C0C682A723231E7BCA0D14 /* FBSnapshotTestCasePlatform.m in Sources */, | ||
| 579 | C390C6005353FB986CB52F474CEF8588 /* FBSnapshotTestController.m in Sources */, | ||
| 580 | 2975A09730FD83DC0897129A11EA6585 /* SwiftSupport.swift in Sources */, | ||
| 581 | 74339C58AC4E5631FB8C0E662668A796 /* UIApplication+StrictKeyWindow.m in Sources */, | ||
| 582 | B52281F9F4340D4FC8ABB2FEB1FEC08E /* UIImage+Compare.m in Sources */, | ||
| 583 | CA54C09A12400567AFFCB407EEB7E154 /* UIImage+Diff.m in Sources */, | ||
| 584 | 2CB61F6FA511CAACB43A50DC3A82E0DD /* UIImage+Snapshot.m in Sources */, | ||
| 585 | ); | ||
| 586 | runOnlyForDeploymentPostprocessing = 0; | ||
| 587 | }; | ||
| 588 | /* End PBXSourcesBuildPhase section */ | ||
| 589 | |||
| 590 | /* Begin PBXTargetDependency section */ | ||
| 591 | 3AF61007514CF0AFCC7256532F9DE52B /* PBXTargetDependency */ = { | ||
| 592 | isa = PBXTargetDependency; | ||
| 593 | name = "Pods-JCategoryKit_Example"; | ||
| 594 | target = 89FF20DFD77917C56542F2A1165780B9 /* Pods-JCategoryKit_Example */; | ||
| 595 | targetProxy = 6EE343F8BF4D8337D9FF4BE43FCA5B5A /* PBXContainerItemProxy */; | ||
| 596 | }; | ||
| 597 | 6048586FB694D0F4D109E4F24C236B37 /* PBXTargetDependency */ = { | ||
| 598 | isa = PBXTargetDependency; | ||
| 599 | name = FBSnapshotTestCase; | ||
| 600 | target = 98A98149697C80CEF8D5772791E92E66 /* FBSnapshotTestCase */; | ||
| 601 | targetProxy = 13A716B1156C45AE995D24E478E19272 /* PBXContainerItemProxy */; | ||
| 602 | }; | ||
| 603 | 822EBC7784E7CFF3DB57B191D03AFBE9 /* PBXTargetDependency */ = { | ||
| 604 | isa = PBXTargetDependency; | ||
| 605 | name = JCategoryKit; | ||
| 606 | target = 9194957B171ABDD1325D09DCDB3F7853 /* JCategoryKit */; | ||
| 607 | targetProxy = 4CAC3E82F5E0677718ABB7C8859E178B /* PBXContainerItemProxy */; | ||
| 608 | }; | ||
| 609 | /* End PBXTargetDependency section */ | ||
| 610 | |||
| 611 | /* Begin XCBuildConfiguration section */ | ||
| 612 | 0CF977E736A9F0297ED689DCD07C3E1C /* Release */ = { | ||
| 613 | isa = XCBuildConfiguration; | ||
| 614 | baseConfigurationReference = 4C6513B09838318BD763CFD5390D1DE0 /* FBSnapshotTestCase.release.xcconfig */; | ||
| 615 | buildSettings = { | ||
| 616 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; | ||
| 617 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; | ||
| 618 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; | ||
| 619 | CURRENT_PROJECT_VERSION = 1; | ||
| 620 | DEFINES_MODULE = YES; | ||
| 621 | DYLIB_COMPATIBILITY_VERSION = 1; | ||
| 622 | DYLIB_CURRENT_VERSION = 1; | ||
| 623 | DYLIB_INSTALL_NAME_BASE = "@rpath"; | ||
| 624 | GCC_PREFIX_HEADER = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch"; | ||
| 625 | INFOPLIST_FILE = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-Info.plist"; | ||
| 626 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; | ||
| 627 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; | ||
| 628 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; | ||
| 629 | MODULEMAP_FILE = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.modulemap"; | ||
| 630 | PRODUCT_MODULE_NAME = FBSnapshotTestCase; | ||
| 631 | PRODUCT_NAME = FBSnapshotTestCase; | ||
| 632 | SDKROOT = iphoneos; | ||
| 633 | SKIP_INSTALL = YES; | ||
| 634 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; | ||
| 635 | SWIFT_VERSION = 4.0; | ||
| 636 | TARGETED_DEVICE_FAMILY = "1,2"; | ||
| 637 | VALIDATE_PRODUCT = YES; | ||
| 638 | VERSIONING_SYSTEM = "apple-generic"; | ||
| 639 | VERSION_INFO_PREFIX = ""; | ||
| 640 | }; | ||
| 641 | name = Release; | ||
| 642 | }; | ||
| 643 | 1AFDAF22A889BBB8DABDF70A209C6E60 /* Debug */ = { | ||
| 644 | isa = XCBuildConfiguration; | ||
| 645 | baseConfigurationReference = 3C3FEFACA643AF8D43792C15DE202DA5 /* JCategoryKit.debug.xcconfig */; | ||
| 646 | buildSettings = { | ||
| 647 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; | ||
| 648 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; | ||
| 649 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; | ||
| 650 | CURRENT_PROJECT_VERSION = 1; | ||
| 651 | DEFINES_MODULE = YES; | ||
| 652 | DYLIB_COMPATIBILITY_VERSION = 1; | ||
| 653 | DYLIB_CURRENT_VERSION = 1; | ||
| 654 | DYLIB_INSTALL_NAME_BASE = "@rpath"; | ||
| 655 | GCC_PREFIX_HEADER = "Target Support Files/JCategoryKit/JCategoryKit-prefix.pch"; | ||
| 656 | INFOPLIST_FILE = "Target Support Files/JCategoryKit/JCategoryKit-Info.plist"; | ||
| 657 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; | ||
| 658 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; | ||
| 659 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; | ||
| 660 | MODULEMAP_FILE = "Target Support Files/JCategoryKit/JCategoryKit.modulemap"; | ||
| 661 | PRODUCT_MODULE_NAME = JCategoryKit; | ||
| 662 | PRODUCT_NAME = JCategoryKit; | ||
| 663 | SDKROOT = iphoneos; | ||
| 664 | SKIP_INSTALL = YES; | ||
| 665 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; | ||
| 666 | SWIFT_VERSION = 4.0; | ||
| 667 | TARGETED_DEVICE_FAMILY = "1,2"; | ||
| 668 | VERSIONING_SYSTEM = "apple-generic"; | ||
| 669 | VERSION_INFO_PREFIX = ""; | ||
| 670 | }; | ||
| 671 | name = Debug; | ||
| 672 | }; | ||
| 673 | 1C4D3CFFCB5710DB5914983F615BB382 /* Debug */ = { | ||
| 674 | isa = XCBuildConfiguration; | ||
| 675 | baseConfigurationReference = B943F9244637A6A5CFB93CC665A2BDBB /* Pods-JCategoryKit_Tests.debug.xcconfig */; | ||
| 676 | buildSettings = { | ||
| 677 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; | ||
| 678 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; | ||
| 679 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; | ||
| 680 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; | ||
| 681 | CURRENT_PROJECT_VERSION = 1; | ||
| 682 | DEFINES_MODULE = YES; | ||
| 683 | DYLIB_COMPATIBILITY_VERSION = 1; | ||
| 684 | DYLIB_CURRENT_VERSION = 1; | ||
| 685 | DYLIB_INSTALL_NAME_BASE = "@rpath"; | ||
| 686 | INFOPLIST_FILE = "Target Support Files/Pods-JCategoryKit_Tests/Pods-JCategoryKit_Tests-Info.plist"; | ||
| 687 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; | ||
| 688 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; | ||
| 689 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; | ||
| 690 | MACH_O_TYPE = staticlib; | ||
| 691 | MODULEMAP_FILE = "Target Support Files/Pods-JCategoryKit_Tests/Pods-JCategoryKit_Tests.modulemap"; | ||
| 692 | OTHER_LDFLAGS = ""; | ||
| 693 | OTHER_LIBTOOLFLAGS = ""; | ||
| 694 | PODS_ROOT = "$(SRCROOT)"; | ||
| 695 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; | ||
| 696 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; | ||
| 697 | SDKROOT = iphoneos; | ||
| 698 | SKIP_INSTALL = YES; | ||
| 699 | TARGETED_DEVICE_FAMILY = "1,2"; | ||
| 700 | VERSIONING_SYSTEM = "apple-generic"; | ||
| 701 | VERSION_INFO_PREFIX = ""; | ||
| 702 | }; | ||
| 703 | name = Debug; | ||
| 704 | }; | ||
| 705 | 25AD9454612BF454A1E3DC4CD4FA8C6D /* Debug */ = { | ||
| 706 | isa = XCBuildConfiguration; | ||
| 707 | buildSettings = { | ||
| 708 | ALWAYS_SEARCH_USER_PATHS = NO; | ||
| 709 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; | ||
| 710 | CLANG_ANALYZER_NONNULL = YES; | ||
| 711 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; | ||
| 712 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; | ||
| 713 | CLANG_CXX_LIBRARY = "libc++"; | ||
| 714 | CLANG_ENABLE_MODULES = YES; | ||
| 715 | CLANG_ENABLE_OBJC_ARC = YES; | ||
| 716 | CLANG_ENABLE_OBJC_WEAK = YES; | ||
| 717 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; | ||
| 718 | CLANG_WARN_BOOL_CONVERSION = YES; | ||
| 719 | CLANG_WARN_COMMA = YES; | ||
| 720 | CLANG_WARN_CONSTANT_CONVERSION = YES; | ||
| 721 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; | ||
| 722 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | ||
| 723 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; | ||
| 724 | CLANG_WARN_EMPTY_BODY = YES; | ||
| 725 | CLANG_WARN_ENUM_CONVERSION = YES; | ||
| 726 | CLANG_WARN_INFINITE_RECURSION = YES; | ||
| 727 | CLANG_WARN_INT_CONVERSION = YES; | ||
| 728 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; | ||
| 729 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; | ||
| 730 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; | ||
| 731 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | ||
| 732 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; | ||
| 733 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; | ||
| 734 | CLANG_WARN_STRICT_PROTOTYPES = YES; | ||
| 735 | CLANG_WARN_SUSPICIOUS_MOVE = YES; | ||
| 736 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; | ||
| 737 | CLANG_WARN_UNREACHABLE_CODE = YES; | ||
| 738 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | ||
| 739 | COPY_PHASE_STRIP = NO; | ||
| 740 | DEBUG_INFORMATION_FORMAT = dwarf; | ||
| 741 | ENABLE_STRICT_OBJC_MSGSEND = YES; | ||
| 742 | ENABLE_TESTABILITY = YES; | ||
| 743 | GCC_C_LANGUAGE_STANDARD = gnu11; | ||
| 744 | GCC_DYNAMIC_NO_PIC = NO; | ||
| 745 | GCC_NO_COMMON_BLOCKS = YES; | ||
| 746 | GCC_OPTIMIZATION_LEVEL = 0; | ||
| 747 | GCC_PREPROCESSOR_DEFINITIONS = ( | ||
| 748 | "POD_CONFIGURATION_DEBUG=1", | ||
| 749 | "DEBUG=1", | ||
| 750 | "$(inherited)", | ||
| 751 | ); | ||
| 752 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | ||
| 753 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | ||
| 754 | GCC_WARN_UNDECLARED_SELECTOR = YES; | ||
| 755 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||
| 756 | GCC_WARN_UNUSED_FUNCTION = YES; | ||
| 757 | GCC_WARN_UNUSED_VARIABLE = YES; | ||
| 758 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; | ||
| 759 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; | ||
| 760 | MTL_FAST_MATH = YES; | ||
| 761 | ONLY_ACTIVE_ARCH = YES; | ||
| 762 | PRODUCT_NAME = "$(TARGET_NAME)"; | ||
| 763 | STRIP_INSTALLED_PRODUCT = NO; | ||
| 764 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; | ||
| 765 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; | ||
| 766 | SWIFT_VERSION = 5.0; | ||
| 767 | SYMROOT = "${SRCROOT}/../build"; | ||
| 768 | }; | ||
| 769 | name = Debug; | ||
| 770 | }; | ||
| 771 | 842C60C4F1EBC85F9C8FF97D39D120FF /* Debug */ = { | ||
| 772 | isa = XCBuildConfiguration; | ||
| 773 | baseConfigurationReference = 9468E867498BBAF36F9AFFE4845F8B09 /* FBSnapshotTestCase.debug.xcconfig */; | ||
| 774 | buildSettings = { | ||
| 775 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; | ||
| 776 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; | ||
| 777 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; | ||
| 778 | CURRENT_PROJECT_VERSION = 1; | ||
| 779 | DEFINES_MODULE = YES; | ||
| 780 | DYLIB_COMPATIBILITY_VERSION = 1; | ||
| 781 | DYLIB_CURRENT_VERSION = 1; | ||
| 782 | DYLIB_INSTALL_NAME_BASE = "@rpath"; | ||
| 783 | GCC_PREFIX_HEADER = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-prefix.pch"; | ||
| 784 | INFOPLIST_FILE = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase-Info.plist"; | ||
| 785 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; | ||
| 786 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; | ||
| 787 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; | ||
| 788 | MODULEMAP_FILE = "Target Support Files/FBSnapshotTestCase/FBSnapshotTestCase.modulemap"; | ||
| 789 | PRODUCT_MODULE_NAME = FBSnapshotTestCase; | ||
| 790 | PRODUCT_NAME = FBSnapshotTestCase; | ||
| 791 | SDKROOT = iphoneos; | ||
| 792 | SKIP_INSTALL = YES; | ||
| 793 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; | ||
| 794 | SWIFT_VERSION = 4.0; | ||
| 795 | TARGETED_DEVICE_FAMILY = "1,2"; | ||
| 796 | VERSIONING_SYSTEM = "apple-generic"; | ||
| 797 | VERSION_INFO_PREFIX = ""; | ||
| 798 | }; | ||
| 799 | name = Debug; | ||
| 800 | }; | ||
| 801 | AECB50D8E37BB6EC5210EE9BC034316D /* Release */ = { | ||
| 802 | isa = XCBuildConfiguration; | ||
| 803 | baseConfigurationReference = 5620CCE2A9810C085DFE0B5A58131DB9 /* JCategoryKit.release.xcconfig */; | ||
| 804 | buildSettings = { | ||
| 805 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; | ||
| 806 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; | ||
| 807 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; | ||
| 808 | CURRENT_PROJECT_VERSION = 1; | ||
| 809 | DEFINES_MODULE = YES; | ||
| 810 | DYLIB_COMPATIBILITY_VERSION = 1; | ||
| 811 | DYLIB_CURRENT_VERSION = 1; | ||
| 812 | DYLIB_INSTALL_NAME_BASE = "@rpath"; | ||
| 813 | GCC_PREFIX_HEADER = "Target Support Files/JCategoryKit/JCategoryKit-prefix.pch"; | ||
| 814 | INFOPLIST_FILE = "Target Support Files/JCategoryKit/JCategoryKit-Info.plist"; | ||
| 815 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; | ||
| 816 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; | ||
| 817 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; | ||
| 818 | MODULEMAP_FILE = "Target Support Files/JCategoryKit/JCategoryKit.modulemap"; | ||
| 819 | PRODUCT_MODULE_NAME = JCategoryKit; | ||
| 820 | PRODUCT_NAME = JCategoryKit; | ||
| 821 | SDKROOT = iphoneos; | ||
| 822 | SKIP_INSTALL = YES; | ||
| 823 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; | ||
| 824 | SWIFT_VERSION = 4.0; | ||
| 825 | TARGETED_DEVICE_FAMILY = "1,2"; | ||
| 826 | VALIDATE_PRODUCT = YES; | ||
| 827 | VERSIONING_SYSTEM = "apple-generic"; | ||
| 828 | VERSION_INFO_PREFIX = ""; | ||
| 829 | }; | ||
| 830 | name = Release; | ||
| 831 | }; | ||
| 832 | B5C68F3D9147D022CD58A5FB4427F0FD /* Debug */ = { | ||
| 833 | isa = XCBuildConfiguration; | ||
| 834 | baseConfigurationReference = 48AAF2BC3C1305701486AB0C3A57E7C2 /* Pods-JCategoryKit_Example.debug.xcconfig */; | ||
| 835 | buildSettings = { | ||
| 836 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; | ||
| 837 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; | ||
| 838 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; | ||
| 839 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; | ||
| 840 | CURRENT_PROJECT_VERSION = 1; | ||
| 841 | DEFINES_MODULE = YES; | ||
| 842 | DYLIB_COMPATIBILITY_VERSION = 1; | ||
| 843 | DYLIB_CURRENT_VERSION = 1; | ||
| 844 | DYLIB_INSTALL_NAME_BASE = "@rpath"; | ||
| 845 | INFOPLIST_FILE = "Target Support Files/Pods-JCategoryKit_Example/Pods-JCategoryKit_Example-Info.plist"; | ||
| 846 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; | ||
| 847 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; | ||
| 848 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; | ||
| 849 | MACH_O_TYPE = staticlib; | ||
| 850 | MODULEMAP_FILE = "Target Support Files/Pods-JCategoryKit_Example/Pods-JCategoryKit_Example.modulemap"; | ||
| 851 | OTHER_LDFLAGS = ""; | ||
| 852 | OTHER_LIBTOOLFLAGS = ""; | ||
| 853 | PODS_ROOT = "$(SRCROOT)"; | ||
| 854 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; | ||
| 855 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; | ||
| 856 | SDKROOT = iphoneos; | ||
| 857 | SKIP_INSTALL = YES; | ||
| 858 | TARGETED_DEVICE_FAMILY = "1,2"; | ||
| 859 | VERSIONING_SYSTEM = "apple-generic"; | ||
| 860 | VERSION_INFO_PREFIX = ""; | ||
| 861 | }; | ||
| 862 | name = Debug; | ||
| 863 | }; | ||
| 864 | CA547D2C7E9A8A153DC2B27FBE00B112 /* Release */ = { | ||
| 865 | isa = XCBuildConfiguration; | ||
| 866 | buildSettings = { | ||
| 867 | ALWAYS_SEARCH_USER_PATHS = NO; | ||
| 868 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; | ||
| 869 | CLANG_ANALYZER_NONNULL = YES; | ||
| 870 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; | ||
| 871 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; | ||
| 872 | CLANG_CXX_LIBRARY = "libc++"; | ||
| 873 | CLANG_ENABLE_MODULES = YES; | ||
| 874 | CLANG_ENABLE_OBJC_ARC = YES; | ||
| 875 | CLANG_ENABLE_OBJC_WEAK = YES; | ||
| 876 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; | ||
| 877 | CLANG_WARN_BOOL_CONVERSION = YES; | ||
| 878 | CLANG_WARN_COMMA = YES; | ||
| 879 | CLANG_WARN_CONSTANT_CONVERSION = YES; | ||
| 880 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; | ||
| 881 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; | ||
| 882 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; | ||
| 883 | CLANG_WARN_EMPTY_BODY = YES; | ||
| 884 | CLANG_WARN_ENUM_CONVERSION = YES; | ||
| 885 | CLANG_WARN_INFINITE_RECURSION = YES; | ||
| 886 | CLANG_WARN_INT_CONVERSION = YES; | ||
| 887 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; | ||
| 888 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; | ||
| 889 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; | ||
| 890 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; | ||
| 891 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; | ||
| 892 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; | ||
| 893 | CLANG_WARN_STRICT_PROTOTYPES = YES; | ||
| 894 | CLANG_WARN_SUSPICIOUS_MOVE = YES; | ||
| 895 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; | ||
| 896 | CLANG_WARN_UNREACHABLE_CODE = YES; | ||
| 897 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; | ||
| 898 | COPY_PHASE_STRIP = NO; | ||
| 899 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; | ||
| 900 | ENABLE_NS_ASSERTIONS = NO; | ||
| 901 | ENABLE_STRICT_OBJC_MSGSEND = YES; | ||
| 902 | GCC_C_LANGUAGE_STANDARD = gnu11; | ||
| 903 | GCC_NO_COMMON_BLOCKS = YES; | ||
| 904 | GCC_PREPROCESSOR_DEFINITIONS = ( | ||
| 905 | "POD_CONFIGURATION_RELEASE=1", | ||
| 906 | "$(inherited)", | ||
| 907 | ); | ||
| 908 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; | ||
| 909 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; | ||
| 910 | GCC_WARN_UNDECLARED_SELECTOR = YES; | ||
| 911 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; | ||
| 912 | GCC_WARN_UNUSED_FUNCTION = YES; | ||
| 913 | GCC_WARN_UNUSED_VARIABLE = YES; | ||
| 914 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; | ||
| 915 | MTL_ENABLE_DEBUG_INFO = NO; | ||
| 916 | MTL_FAST_MATH = YES; | ||
| 917 | PRODUCT_NAME = "$(TARGET_NAME)"; | ||
| 918 | STRIP_INSTALLED_PRODUCT = NO; | ||
| 919 | SWIFT_COMPILATION_MODE = wholemodule; | ||
| 920 | SWIFT_OPTIMIZATION_LEVEL = "-O"; | ||
| 921 | SWIFT_VERSION = 5.0; | ||
| 922 | SYMROOT = "${SRCROOT}/../build"; | ||
| 923 | }; | ||
| 924 | name = Release; | ||
| 925 | }; | ||
| 926 | D74FFB2976DB81ABA3511780D3EEC2BF /* Release */ = { | ||
| 927 | isa = XCBuildConfiguration; | ||
| 928 | baseConfigurationReference = 673E6D8309EB7D55EC873FBAC2312B1F /* Pods-JCategoryKit_Example.release.xcconfig */; | ||
| 929 | buildSettings = { | ||
| 930 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; | ||
| 931 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; | ||
| 932 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; | ||
| 933 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; | ||
| 934 | CURRENT_PROJECT_VERSION = 1; | ||
| 935 | DEFINES_MODULE = YES; | ||
| 936 | DYLIB_COMPATIBILITY_VERSION = 1; | ||
| 937 | DYLIB_CURRENT_VERSION = 1; | ||
| 938 | DYLIB_INSTALL_NAME_BASE = "@rpath"; | ||
| 939 | INFOPLIST_FILE = "Target Support Files/Pods-JCategoryKit_Example/Pods-JCategoryKit_Example-Info.plist"; | ||
| 940 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; | ||
| 941 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; | ||
| 942 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; | ||
| 943 | MACH_O_TYPE = staticlib; | ||
| 944 | MODULEMAP_FILE = "Target Support Files/Pods-JCategoryKit_Example/Pods-JCategoryKit_Example.modulemap"; | ||
| 945 | OTHER_LDFLAGS = ""; | ||
| 946 | OTHER_LIBTOOLFLAGS = ""; | ||
| 947 | PODS_ROOT = "$(SRCROOT)"; | ||
| 948 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; | ||
| 949 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; | ||
| 950 | SDKROOT = iphoneos; | ||
| 951 | SKIP_INSTALL = YES; | ||
| 952 | TARGETED_DEVICE_FAMILY = "1,2"; | ||
| 953 | VALIDATE_PRODUCT = YES; | ||
| 954 | VERSIONING_SYSTEM = "apple-generic"; | ||
| 955 | VERSION_INFO_PREFIX = ""; | ||
| 956 | }; | ||
| 957 | name = Release; | ||
| 958 | }; | ||
| 959 | DD60B35D75AFBB5C1E0777D301407576 /* Release */ = { | ||
| 960 | isa = XCBuildConfiguration; | ||
| 961 | baseConfigurationReference = 52A0DD7D517C8CA97519396C08EF2C83 /* Pods-JCategoryKit_Tests.release.xcconfig */; | ||
| 962 | buildSettings = { | ||
| 963 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; | ||
| 964 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; | ||
| 965 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; | ||
| 966 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; | ||
| 967 | CURRENT_PROJECT_VERSION = 1; | ||
| 968 | DEFINES_MODULE = YES; | ||
| 969 | DYLIB_COMPATIBILITY_VERSION = 1; | ||
| 970 | DYLIB_CURRENT_VERSION = 1; | ||
| 971 | DYLIB_INSTALL_NAME_BASE = "@rpath"; | ||
| 972 | INFOPLIST_FILE = "Target Support Files/Pods-JCategoryKit_Tests/Pods-JCategoryKit_Tests-Info.plist"; | ||
| 973 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; | ||
| 974 | IPHONEOS_DEPLOYMENT_TARGET = 9.0; | ||
| 975 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; | ||
| 976 | MACH_O_TYPE = staticlib; | ||
| 977 | MODULEMAP_FILE = "Target Support Files/Pods-JCategoryKit_Tests/Pods-JCategoryKit_Tests.modulemap"; | ||
| 978 | OTHER_LDFLAGS = ""; | ||
| 979 | OTHER_LIBTOOLFLAGS = ""; | ||
| 980 | PODS_ROOT = "$(SRCROOT)"; | ||
| 981 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; | ||
| 982 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; | ||
| 983 | SDKROOT = iphoneos; | ||
| 984 | SKIP_INSTALL = YES; | ||
| 985 | TARGETED_DEVICE_FAMILY = "1,2"; | ||
| 986 | VALIDATE_PRODUCT = YES; | ||
| 987 | VERSIONING_SYSTEM = "apple-generic"; | ||
| 988 | VERSION_INFO_PREFIX = ""; | ||
| 989 | }; | ||
| 990 | name = Release; | ||
| 991 | }; | ||
| 992 | /* End XCBuildConfiguration section */ | ||
| 993 | |||
| 994 | /* Begin XCConfigurationList section */ | ||
| 995 | 07F02FB7FC113439A52F6E94082A5A77 /* Build configuration list for PBXNativeTarget "Pods-JCategoryKit_Tests" */ = { | ||
| 996 | isa = XCConfigurationList; | ||
| 997 | buildConfigurations = ( | ||
| 998 | 1C4D3CFFCB5710DB5914983F615BB382 /* Debug */, | ||
| 999 | DD60B35D75AFBB5C1E0777D301407576 /* Release */, | ||
| 1000 | ); | ||
| 1001 | defaultConfigurationIsVisible = 0; | ||
| 1002 | defaultConfigurationName = Release; | ||
| 1003 | }; | ||
| 1004 | 28DAA9880679133EC375B7072B9AEABB /* Build configuration list for PBXNativeTarget "FBSnapshotTestCase" */ = { | ||
| 1005 | isa = XCConfigurationList; | ||
| 1006 | buildConfigurations = ( | ||
| 1007 | 842C60C4F1EBC85F9C8FF97D39D120FF /* Debug */, | ||
| 1008 | 0CF977E736A9F0297ED689DCD07C3E1C /* Release */, | ||
| 1009 | ); | ||
| 1010 | defaultConfigurationIsVisible = 0; | ||
| 1011 | defaultConfigurationName = Release; | ||
| 1012 | }; | ||
| 1013 | 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { | ||
| 1014 | isa = XCConfigurationList; | ||
| 1015 | buildConfigurations = ( | ||
| 1016 | 25AD9454612BF454A1E3DC4CD4FA8C6D /* Debug */, | ||
| 1017 | CA547D2C7E9A8A153DC2B27FBE00B112 /* Release */, | ||
| 1018 | ); | ||
| 1019 | defaultConfigurationIsVisible = 0; | ||
| 1020 | defaultConfigurationName = Release; | ||
| 1021 | }; | ||
| 1022 | 817037DAB64C8B45390E2F1684C6657E /* Build configuration list for PBXNativeTarget "JCategoryKit" */ = { | ||
| 1023 | isa = XCConfigurationList; | ||
| 1024 | buildConfigurations = ( | ||
| 1025 | 1AFDAF22A889BBB8DABDF70A209C6E60 /* Debug */, | ||
| 1026 | AECB50D8E37BB6EC5210EE9BC034316D /* Release */, | ||
| 1027 | ); | ||
| 1028 | defaultConfigurationIsVisible = 0; | ||
| 1029 | defaultConfigurationName = Release; | ||
| 1030 | }; | ||
| 1031 | 92A2C15F0A5EC28B5334BF0558B58F78 /* Build configuration list for PBXNativeTarget "Pods-JCategoryKit_Example" */ = { | ||
| 1032 | isa = XCConfigurationList; | ||
| 1033 | buildConfigurations = ( | ||
| 1034 | B5C68F3D9147D022CD58A5FB4427F0FD /* Debug */, | ||
| 1035 | D74FFB2976DB81ABA3511780D3EEC2BF /* Release */, | ||
| 1036 | ); | ||
| 1037 | defaultConfigurationIsVisible = 0; | ||
| 1038 | defaultConfigurationName = Release; | ||
| 1039 | }; | ||
| 1040 | /* End XCConfigurationList section */ | ||
| 1041 | }; | ||
| 1042 | rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; | ||
| 1043 | } |
| 1 | <?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
| 3 | <plist version="1.0"> | ||
| 4 | <dict> | ||
| 5 | <key>CFBundleDevelopmentRegion</key> | ||
| 6 | <string>en</string> | ||
| 7 | <key>CFBundleExecutable</key> | ||
| 8 | <string>${EXECUTABLE_NAME}</string> | ||
| 9 | <key>CFBundleIdentifier</key> | ||
| 10 | <string>${PRODUCT_BUNDLE_IDENTIFIER}</string> | ||
| 11 | <key>CFBundleInfoDictionaryVersion</key> | ||
| 12 | <string>6.0</string> | ||
| 13 | <key>CFBundleName</key> | ||
| 14 | <string>${PRODUCT_NAME}</string> | ||
| 15 | <key>CFBundlePackageType</key> | ||
| 16 | <string>FMWK</string> | ||
| 17 | <key>CFBundleShortVersionString</key> | ||
| 18 | <string>2.1.4</string> | ||
| 19 | <key>CFBundleSignature</key> | ||
| 20 | <string>????</string> | ||
| 21 | <key>CFBundleVersion</key> | ||
| 22 | <string>${CURRENT_PROJECT_VERSION}</string> | ||
| 23 | <key>NSPrincipalClass</key> | ||
| 24 | <string></string> | ||
| 25 | </dict> | ||
| 26 | </plist> |
| 1 | #ifdef __OBJC__ | ||
| 2 | #import <UIKit/UIKit.h> | ||
| 3 | #else | ||
| 4 | #ifndef FOUNDATION_EXPORT | ||
| 5 | #if defined(__cplusplus) | ||
| 6 | #define FOUNDATION_EXPORT extern "C" | ||
| 7 | #else | ||
| 8 | #define FOUNDATION_EXPORT extern | ||
| 9 | #endif | ||
| 10 | #endif | ||
| 11 | #endif | ||
| 12 | |||
| 13 | #import "FBSnapshotTestCase.h" | ||
| 14 | #import "FBSnapshotTestCasePlatform.h" | ||
| 15 | #import "FBSnapshotTestController.h" | ||
| 16 | |||
| 17 | FOUNDATION_EXPORT double FBSnapshotTestCaseVersionNumber; | ||
| 18 | FOUNDATION_EXPORT const unsigned char FBSnapshotTestCaseVersionString[]; | ||
| 19 |
| 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO | ||
| 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FBSnapshotTestCase | ||
| 3 | ENABLE_BITCODE = NO | ||
| 4 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" | ||
| 5 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 | ||
| 6 | LIBRARY_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/usr/lib" "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift | ||
| 7 | OTHER_LDFLAGS = $(inherited) -framework "Foundation" -framework "QuartzCore" -framework "UIKit" -framework "XCTest" | ||
| 8 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS | ||
| 9 | PODS_BUILD_DIR = ${BUILD_DIR} | ||
| 10 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) | ||
| 11 | PODS_ROOT = ${SRCROOT} | ||
| 12 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/FBSnapshotTestCase | ||
| 13 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates | ||
| 14 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} | ||
| 15 | SKIP_INSTALL = YES | ||
| 16 | SWIFT_INCLUDE_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/usr/lib" | ||
| 17 | SYSTEM_FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" | ||
| 18 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES |
| 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO | ||
| 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/FBSnapshotTestCase | ||
| 3 | ENABLE_BITCODE = NO | ||
| 4 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" | ||
| 5 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 | ||
| 6 | LIBRARY_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/usr/lib" "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift | ||
| 7 | OTHER_LDFLAGS = $(inherited) -framework "Foundation" -framework "QuartzCore" -framework "UIKit" -framework "XCTest" | ||
| 8 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS | ||
| 9 | PODS_BUILD_DIR = ${BUILD_DIR} | ||
| 10 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) | ||
| 11 | PODS_ROOT = ${SRCROOT} | ||
| 12 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/FBSnapshotTestCase | ||
| 13 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates | ||
| 14 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} | ||
| 15 | SKIP_INSTALL = YES | ||
| 16 | SWIFT_INCLUDE_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/usr/lib" | ||
| 17 | SYSTEM_FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" | ||
| 18 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES |
| 1 | <?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
| 3 | <plist version="1.0"> | ||
| 4 | <dict> | ||
| 5 | <key>CFBundleDevelopmentRegion</key> | ||
| 6 | <string>en</string> | ||
| 7 | <key>CFBundleExecutable</key> | ||
| 8 | <string>${EXECUTABLE_NAME}</string> | ||
| 9 | <key>CFBundleIdentifier</key> | ||
| 10 | <string>${PRODUCT_BUNDLE_IDENTIFIER}</string> | ||
| 11 | <key>CFBundleInfoDictionaryVersion</key> | ||
| 12 | <string>6.0</string> | ||
| 13 | <key>CFBundleName</key> | ||
| 14 | <string>${PRODUCT_NAME}</string> | ||
| 15 | <key>CFBundlePackageType</key> | ||
| 16 | <string>FMWK</string> | ||
| 17 | <key>CFBundleShortVersionString</key> | ||
| 18 | <string>1.0.0</string> | ||
| 19 | <key>CFBundleSignature</key> | ||
| 20 | <string>????</string> | ||
| 21 | <key>CFBundleVersion</key> | ||
| 22 | <string>${CURRENT_PROJECT_VERSION}</string> | ||
| 23 | <key>NSPrincipalClass</key> | ||
| 24 | <string></string> | ||
| 25 | </dict> | ||
| 26 | </plist> |
| 1 | #ifdef __OBJC__ | ||
| 2 | #import <UIKit/UIKit.h> | ||
| 3 | #else | ||
| 4 | #ifndef FOUNDATION_EXPORT | ||
| 5 | #if defined(__cplusplus) | ||
| 6 | #define FOUNDATION_EXPORT extern "C" | ||
| 7 | #else | ||
| 8 | #define FOUNDATION_EXPORT extern | ||
| 9 | #endif | ||
| 10 | #endif | ||
| 11 | #endif | ||
| 12 | |||
| 13 | #import "Person.h" | ||
| 14 | |||
| 15 | FOUNDATION_EXPORT double JCategoryKitVersionNumber; | ||
| 16 | FOUNDATION_EXPORT const unsigned char JCategoryKitVersionString[]; | ||
| 17 |
| 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO | ||
| 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/JCategoryKit | ||
| 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 | ||
| 4 | PODS_BUILD_DIR = ${BUILD_DIR} | ||
| 5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) | ||
| 6 | PODS_ROOT = ${SRCROOT} | ||
| 7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. | ||
| 8 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates | ||
| 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} | ||
| 10 | SKIP_INSTALL = YES | ||
| 11 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES |
| 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO | ||
| 2 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/JCategoryKit | ||
| 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 | ||
| 4 | PODS_BUILD_DIR = ${BUILD_DIR} | ||
| 5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) | ||
| 6 | PODS_ROOT = ${SRCROOT} | ||
| 7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. | ||
| 8 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates | ||
| 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} | ||
| 10 | SKIP_INSTALL = YES | ||
| 11 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES |
Example/Pods/Target Support Files/Pods-JCategoryKit_Example/Pods-JCategoryKit_Example-Info.plist
0 → 100644
| 1 | <?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
| 3 | <plist version="1.0"> | ||
| 4 | <dict> | ||
| 5 | <key>CFBundleDevelopmentRegion</key> | ||
| 6 | <string>en</string> | ||
| 7 | <key>CFBundleExecutable</key> | ||
| 8 | <string>${EXECUTABLE_NAME}</string> | ||
| 9 | <key>CFBundleIdentifier</key> | ||
| 10 | <string>${PRODUCT_BUNDLE_IDENTIFIER}</string> | ||
| 11 | <key>CFBundleInfoDictionaryVersion</key> | ||
| 12 | <string>6.0</string> | ||
| 13 | <key>CFBundleName</key> | ||
| 14 | <string>${PRODUCT_NAME}</string> | ||
| 15 | <key>CFBundlePackageType</key> | ||
| 16 | <string>FMWK</string> | ||
| 17 | <key>CFBundleShortVersionString</key> | ||
| 18 | <string>1.0.0</string> | ||
| 19 | <key>CFBundleSignature</key> | ||
| 20 | <string>????</string> | ||
| 21 | <key>CFBundleVersion</key> | ||
| 22 | <string>${CURRENT_PROJECT_VERSION}</string> | ||
| 23 | <key>NSPrincipalClass</key> | ||
| 24 | <string></string> | ||
| 25 | </dict> | ||
| 26 | </plist> |
| 1 | # Acknowledgements | ||
| 2 | This application makes use of the following third party libraries: | ||
| 3 | |||
| 4 | ## JCategoryKit | ||
| 5 | |||
| 6 | Copyright (c) 2021 weixq <weixiaoqiang@situdata.com> | ||
| 7 | |||
| 8 | Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| 9 | of this software and associated documentation files (the "Software"), to deal | ||
| 10 | in the Software without restriction, including without limitation the rights | ||
| 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
| 12 | copies of the Software, and to permit persons to whom the Software is | ||
| 13 | furnished to do so, subject to the following conditions: | ||
| 14 | |||
| 15 | The above copyright notice and this permission notice shall be included in | ||
| 16 | all copies or substantial portions of the Software. | ||
| 17 | |||
| 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
| 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
| 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||
| 24 | THE SOFTWARE. | ||
| 25 | |||
| 26 | Generated by CocoaPods - https://cocoapods.org |
| 1 | <?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
| 3 | <plist version="1.0"> | ||
| 4 | <dict> | ||
| 5 | <key>PreferenceSpecifiers</key> | ||
| 6 | <array> | ||
| 7 | <dict> | ||
| 8 | <key>FooterText</key> | ||
| 9 | <string>This application makes use of the following third party libraries:</string> | ||
| 10 | <key>Title</key> | ||
| 11 | <string>Acknowledgements</string> | ||
| 12 | <key>Type</key> | ||
| 13 | <string>PSGroupSpecifier</string> | ||
| 14 | </dict> | ||
| 15 | <dict> | ||
| 16 | <key>FooterText</key> | ||
| 17 | <string>Copyright (c) 2021 weixq <weixiaoqiang@situdata.com> | ||
| 18 | |||
| 19 | Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| 20 | of this software and associated documentation files (the "Software"), to deal | ||
| 21 | in the Software without restriction, including without limitation the rights | ||
| 22 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
| 23 | copies of the Software, and to permit persons to whom the Software is | ||
| 24 | furnished to do so, subject to the following conditions: | ||
| 25 | |||
| 26 | The above copyright notice and this permission notice shall be included in | ||
| 27 | all copies or substantial portions of the Software. | ||
| 28 | |||
| 29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
| 32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| 33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
| 34 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||
| 35 | THE SOFTWARE. | ||
| 36 | </string> | ||
| 37 | <key>License</key> | ||
| 38 | <string>MIT</string> | ||
| 39 | <key>Title</key> | ||
| 40 | <string>JCategoryKit</string> | ||
| 41 | <key>Type</key> | ||
| 42 | <string>PSGroupSpecifier</string> | ||
| 43 | </dict> | ||
| 44 | <dict> | ||
| 45 | <key>FooterText</key> | ||
| 46 | <string>Generated by CocoaPods - https://cocoapods.org</string> | ||
| 47 | <key>Title</key> | ||
| 48 | <string></string> | ||
| 49 | <key>Type</key> | ||
| 50 | <string>PSGroupSpecifier</string> | ||
| 51 | </dict> | ||
| 52 | </array> | ||
| 53 | <key>StringsTable</key> | ||
| 54 | <string>Acknowledgements</string> | ||
| 55 | <key>Title</key> | ||
| 56 | <string>Acknowledgements</string> | ||
| 57 | </dict> | ||
| 58 | </plist> |
Example/Pods/Target Support Files/Pods-JCategoryKit_Example/Pods-JCategoryKit_Example-frameworks.sh
0 → 100755
| 1 | #!/bin/sh | ||
| 2 | set -e | ||
| 3 | set -u | ||
| 4 | set -o pipefail | ||
| 5 | |||
| 6 | function on_error { | ||
| 7 | echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" | ||
| 8 | } | ||
| 9 | trap 'on_error $LINENO' ERR | ||
| 10 | |||
| 11 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then | ||
| 12 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy | ||
| 13 | # frameworks to, so exit 0 (signalling the script phase was successful). | ||
| 14 | exit 0 | ||
| 15 | fi | ||
| 16 | |||
| 17 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" | ||
| 18 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" | ||
| 19 | |||
| 20 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" | ||
| 21 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" | ||
| 22 | BCSYMBOLMAP_DIR="BCSymbolMaps" | ||
| 23 | |||
| 24 | |||
| 25 | # This protects against multiple targets copying the same framework dependency at the same time. The solution | ||
| 26 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html | ||
| 27 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") | ||
| 28 | |||
| 29 | # Copies and strips a vendored framework | ||
| 30 | install_framework() | ||
| 31 | { | ||
| 32 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then | ||
| 33 | local source="${BUILT_PRODUCTS_DIR}/$1" | ||
| 34 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then | ||
| 35 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" | ||
| 36 | elif [ -r "$1" ]; then | ||
| 37 | local source="$1" | ||
| 38 | fi | ||
| 39 | |||
| 40 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" | ||
| 41 | |||
| 42 | if [ -L "${source}" ]; then | ||
| 43 | echo "Symlinked..." | ||
| 44 | source="$(readlink "${source}")" | ||
| 45 | fi | ||
| 46 | |||
| 47 | if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then | ||
| 48 | # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied | ||
| 49 | find "${source}/${BCSYMBOLMAP_DIR}" -name "*.bcsymbolmap"|while read f; do | ||
| 50 | echo "Installing $f" | ||
| 51 | install_bcsymbolmap "$f" "$destination" | ||
| 52 | rm "$f" | ||
| 53 | done | ||
| 54 | rmdir "${source}/${BCSYMBOLMAP_DIR}" | ||
| 55 | fi | ||
| 56 | |||
| 57 | # Use filter instead of exclude so missing patterns don't throw errors. | ||
| 58 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" | ||
| 59 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" | ||
| 60 | |||
| 61 | local basename | ||
| 62 | basename="$(basename -s .framework "$1")" | ||
| 63 | binary="${destination}/${basename}.framework/${basename}" | ||
| 64 | |||
| 65 | if ! [ -r "$binary" ]; then | ||
| 66 | binary="${destination}/${basename}" | ||
| 67 | elif [ -L "${binary}" ]; then | ||
| 68 | echo "Destination binary is symlinked..." | ||
| 69 | dirname="$(dirname "${binary}")" | ||
| 70 | binary="${dirname}/$(readlink "${binary}")" | ||
| 71 | fi | ||
| 72 | |||
| 73 | # Strip invalid architectures so "fat" simulator / device frameworks work on device | ||
| 74 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then | ||
| 75 | strip_invalid_archs "$binary" | ||
| 76 | fi | ||
| 77 | |||
| 78 | # Resign the code if required by the build settings to avoid unstable apps | ||
| 79 | code_sign_if_enabled "${destination}/$(basename "$1")" | ||
| 80 | |||
| 81 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. | ||
| 82 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then | ||
| 83 | local swift_runtime_libs | ||
| 84 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) | ||
| 85 | for lib in $swift_runtime_libs; do | ||
| 86 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" | ||
| 87 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" | ||
| 88 | code_sign_if_enabled "${destination}/${lib}" | ||
| 89 | done | ||
| 90 | fi | ||
| 91 | } | ||
| 92 | # Copies and strips a vendored dSYM | ||
| 93 | install_dsym() { | ||
| 94 | local source="$1" | ||
| 95 | warn_missing_arch=${2:-true} | ||
| 96 | if [ -r "$source" ]; then | ||
| 97 | # Copy the dSYM into the targets temp dir. | ||
| 98 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" | ||
| 99 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" | ||
| 100 | |||
| 101 | local basename | ||
| 102 | basename="$(basename -s .dSYM "$source")" | ||
| 103 | binary_name="$(ls "$source/Contents/Resources/DWARF")" | ||
| 104 | binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}" | ||
| 105 | |||
| 106 | # Strip invalid architectures from the dSYM. | ||
| 107 | if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then | ||
| 108 | strip_invalid_archs "$binary" "$warn_missing_arch" | ||
| 109 | fi | ||
| 110 | if [[ $STRIP_BINARY_RETVAL == 0 ]]; then | ||
| 111 | # Move the stripped file into its final destination. | ||
| 112 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" | ||
| 113 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" | ||
| 114 | else | ||
| 115 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. | ||
| 116 | mkdir -p "${DWARF_DSYM_FOLDER_PATH}" | ||
| 117 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" | ||
| 118 | fi | ||
| 119 | fi | ||
| 120 | } | ||
| 121 | |||
| 122 | # Used as a return value for each invocation of `strip_invalid_archs` function. | ||
| 123 | STRIP_BINARY_RETVAL=0 | ||
| 124 | |||
| 125 | # Strip invalid architectures | ||
| 126 | strip_invalid_archs() { | ||
| 127 | binary="$1" | ||
| 128 | warn_missing_arch=${2:-true} | ||
| 129 | # Get architectures for current target binary | ||
| 130 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" | ||
| 131 | # Intersect them with the architectures we are building for | ||
| 132 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" | ||
| 133 | # If there are no archs supported by this binary then warn the user | ||
| 134 | if [[ -z "$intersected_archs" ]]; then | ||
| 135 | if [[ "$warn_missing_arch" == "true" ]]; then | ||
| 136 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." | ||
| 137 | fi | ||
| 138 | STRIP_BINARY_RETVAL=1 | ||
| 139 | return | ||
| 140 | fi | ||
| 141 | stripped="" | ||
| 142 | for arch in $binary_archs; do | ||
| 143 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then | ||
| 144 | # Strip non-valid architectures in-place | ||
| 145 | lipo -remove "$arch" -output "$binary" "$binary" | ||
| 146 | stripped="$stripped $arch" | ||
| 147 | fi | ||
| 148 | done | ||
| 149 | if [[ "$stripped" ]]; then | ||
| 150 | echo "Stripped $binary of architectures:$stripped" | ||
| 151 | fi | ||
| 152 | STRIP_BINARY_RETVAL=0 | ||
| 153 | } | ||
| 154 | |||
| 155 | # Copies the bcsymbolmap files of a vendored framework | ||
| 156 | install_bcsymbolmap() { | ||
| 157 | local bcsymbolmap_path="$1" | ||
| 158 | local destination="${BUILT_PRODUCTS_DIR}" | ||
| 159 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" | ||
| 160 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" | ||
| 161 | } | ||
| 162 | |||
| 163 | # Signs a framework with the provided identity | ||
| 164 | code_sign_if_enabled() { | ||
| 165 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then | ||
| 166 | # Use the current code_sign_identity | ||
| 167 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" | ||
| 168 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" | ||
| 169 | |||
| 170 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then | ||
| 171 | code_sign_cmd="$code_sign_cmd &" | ||
| 172 | fi | ||
| 173 | echo "$code_sign_cmd" | ||
| 174 | eval "$code_sign_cmd" | ||
| 175 | fi | ||
| 176 | } | ||
| 177 | |||
| 178 | if [[ "$CONFIGURATION" == "Debug" ]]; then | ||
| 179 | install_framework "${BUILT_PRODUCTS_DIR}/JCategoryKit/JCategoryKit.framework" | ||
| 180 | fi | ||
| 181 | if [[ "$CONFIGURATION" == "Release" ]]; then | ||
| 182 | install_framework "${BUILT_PRODUCTS_DIR}/JCategoryKit/JCategoryKit.framework" | ||
| 183 | fi | ||
| 184 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then | ||
| 185 | wait | ||
| 186 | fi |
Example/Pods/Target Support Files/Pods-JCategoryKit_Example/Pods-JCategoryKit_Example-umbrella.h
0 → 100644
| 1 | #ifdef __OBJC__ | ||
| 2 | #import <UIKit/UIKit.h> | ||
| 3 | #else | ||
| 4 | #ifndef FOUNDATION_EXPORT | ||
| 5 | #if defined(__cplusplus) | ||
| 6 | #define FOUNDATION_EXPORT extern "C" | ||
| 7 | #else | ||
| 8 | #define FOUNDATION_EXPORT extern | ||
| 9 | #endif | ||
| 10 | #endif | ||
| 11 | #endif | ||
| 12 | |||
| 13 | |||
| 14 | FOUNDATION_EXPORT double Pods_JCategoryKit_ExampleVersionNumber; | ||
| 15 | FOUNDATION_EXPORT const unsigned char Pods_JCategoryKit_ExampleVersionString[]; | ||
| 16 |
Example/Pods/Target Support Files/Pods-JCategoryKit_Example/Pods-JCategoryKit_Example.debug.xcconfig
0 → 100644
| 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO | ||
| 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/JCategoryKit" | ||
| 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 | ||
| 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/JCategoryKit/JCategoryKit.framework/Headers" | ||
| 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' | ||
| 6 | OTHER_LDFLAGS = $(inherited) -framework "JCategoryKit" | ||
| 7 | PODS_BUILD_DIR = ${BUILD_DIR} | ||
| 8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) | ||
| 9 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. | ||
| 10 | PODS_ROOT = ${SRCROOT}/Pods | ||
| 11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates | ||
| 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES |
| 1 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO | ||
| 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/JCategoryKit" | ||
| 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 | ||
| 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/JCategoryKit/JCategoryKit.framework/Headers" | ||
| 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' | ||
| 6 | OTHER_LDFLAGS = $(inherited) -framework "JCategoryKit" | ||
| 7 | PODS_BUILD_DIR = ${BUILD_DIR} | ||
| 8 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) | ||
| 9 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. | ||
| 10 | PODS_ROOT = ${SRCROOT}/Pods | ||
| 11 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates | ||
| 12 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES |
Example/Pods/Target Support Files/Pods-JCategoryKit_Tests/Pods-JCategoryKit_Tests-Info.plist
0 → 100644
| 1 | <?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
| 3 | <plist version="1.0"> | ||
| 4 | <dict> | ||
| 5 | <key>CFBundleDevelopmentRegion</key> | ||
| 6 | <string>en</string> | ||
| 7 | <key>CFBundleExecutable</key> | ||
| 8 | <string>${EXECUTABLE_NAME}</string> | ||
| 9 | <key>CFBundleIdentifier</key> | ||
| 10 | <string>${PRODUCT_BUNDLE_IDENTIFIER}</string> | ||
| 11 | <key>CFBundleInfoDictionaryVersion</key> | ||
| 12 | <string>6.0</string> | ||
| 13 | <key>CFBundleName</key> | ||
| 14 | <string>${PRODUCT_NAME}</string> | ||
| 15 | <key>CFBundlePackageType</key> | ||
| 16 | <string>FMWK</string> | ||
| 17 | <key>CFBundleShortVersionString</key> | ||
| 18 | <string>1.0.0</string> | ||
| 19 | <key>CFBundleSignature</key> | ||
| 20 | <string>????</string> | ||
| 21 | <key>CFBundleVersion</key> | ||
| 22 | <string>${CURRENT_PROJECT_VERSION}</string> | ||
| 23 | <key>NSPrincipalClass</key> | ||
| 24 | <string></string> | ||
| 25 | </dict> | ||
| 26 | </plist> |
| 1 | # Acknowledgements | ||
| 2 | This application makes use of the following third party libraries: | ||
| 3 | |||
| 4 | ## FBSnapshotTestCase | ||
| 5 | |||
| 6 | BSD License | ||
| 7 | |||
| 8 | For the FBSnapshotTestCase software | ||
| 9 | |||
| 10 | Copyright (c) 2013, Facebook, Inc. | ||
| 11 | All rights reserved. | ||
| 12 | |||
| 13 | Redistribution and use in source and binary forms, with or without | ||
| 14 | modification, are permitted provided that the following conditions are met: | ||
| 15 | |||
| 16 | * Redistributions of source code must retain the above copyright notice, | ||
| 17 | this list of conditions and the following disclaimer. | ||
| 18 | * Redistributions in binary form must reproduce the above copyright notice, | ||
| 19 | this list of conditions and the following disclaimer in the documentation | ||
| 20 | and/or other materials provided with the distribution. | ||
| 21 | * Neither the name Facebook nor the names of its contributors may be used to | ||
| 22 | endorse or promote products derived from this software without specific | ||
| 23 | prior written permission. | ||
| 24 | |||
| 25 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||
| 26 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
| 27 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
| 28 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | ||
| 29 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
| 30 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||
| 31 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 32 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | ||
| 33 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
| 34 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 35 | |||
| 36 | Generated by CocoaPods - https://cocoapods.org |
| 1 | <?xml version="1.0" encoding="UTF-8"?> | ||
| 2 | <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> | ||
| 3 | <plist version="1.0"> | ||
| 4 | <dict> | ||
| 5 | <key>PreferenceSpecifiers</key> | ||
| 6 | <array> | ||
| 7 | <dict> | ||
| 8 | <key>FooterText</key> | ||
| 9 | <string>This application makes use of the following third party libraries:</string> | ||
| 10 | <key>Title</key> | ||
| 11 | <string>Acknowledgements</string> | ||
| 12 | <key>Type</key> | ||
| 13 | <string>PSGroupSpecifier</string> | ||
| 14 | </dict> | ||
| 15 | <dict> | ||
| 16 | <key>FooterText</key> | ||
| 17 | <string>BSD License | ||
| 18 | |||
| 19 | For the FBSnapshotTestCase software | ||
| 20 | |||
| 21 | Copyright (c) 2013, Facebook, Inc. | ||
| 22 | All rights reserved. | ||
| 23 | |||
| 24 | Redistribution and use in source and binary forms, with or without | ||
| 25 | modification, are permitted provided that the following conditions are met: | ||
| 26 | |||
| 27 | * Redistributions of source code must retain the above copyright notice, | ||
| 28 | this list of conditions and the following disclaimer. | ||
| 29 | * Redistributions in binary form must reproduce the above copyright notice, | ||
| 30 | this list of conditions and the following disclaimer in the documentation | ||
| 31 | and/or other materials provided with the distribution. | ||
| 32 | * Neither the name Facebook nor the names of its contributors may be used to | ||
| 33 | endorse or promote products derived from this software without specific | ||
| 34 | prior written permission. | ||
| 35 | |||
| 36 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | ||
| 37 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | ||
| 38 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
| 39 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | ||
| 40 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||
| 41 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||
| 42 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||
| 43 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | ||
| 44 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
| 45 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 46 | </string> | ||
| 47 | <key>License</key> | ||
| 48 | <string>BSD</string> | ||
| 49 | <key>Title</key> | ||
| 50 | <string>FBSnapshotTestCase</string> | ||
| 51 | <key>Type</key> | ||
| 52 | <string>PSGroupSpecifier</string> | ||
| 53 | </dict> | ||
| 54 | <dict> | ||
| 55 | <key>FooterText</key> | ||
| 56 | <string>Generated by CocoaPods - https://cocoapods.org</string> | ||
| 57 | <key>Title</key> | ||
| 58 | <string></string> | ||
| 59 | <key>Type</key> | ||
| 60 | <string>PSGroupSpecifier</string> | ||
| 61 | </dict> | ||
| 62 | </array> | ||
| 63 | <key>StringsTable</key> | ||
| 64 | <string>Acknowledgements</string> | ||
| 65 | <key>Title</key> | ||
| 66 | <string>Acknowledgements</string> | ||
| 67 | </dict> | ||
| 68 | </plist> |
Example/Pods/Target Support Files/Pods-JCategoryKit_Tests/Pods-JCategoryKit_Tests-frameworks.sh
0 → 100755
| 1 | #!/bin/sh | ||
| 2 | set -e | ||
| 3 | set -u | ||
| 4 | set -o pipefail | ||
| 5 | |||
| 6 | function on_error { | ||
| 7 | echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" | ||
| 8 | } | ||
| 9 | trap 'on_error $LINENO' ERR | ||
| 10 | |||
| 11 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then | ||
| 12 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy | ||
| 13 | # frameworks to, so exit 0 (signalling the script phase was successful). | ||
| 14 | exit 0 | ||
| 15 | fi | ||
| 16 | |||
| 17 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" | ||
| 18 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" | ||
| 19 | |||
| 20 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" | ||
| 21 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" | ||
| 22 | BCSYMBOLMAP_DIR="BCSymbolMaps" | ||
| 23 | |||
| 24 | |||
| 25 | # This protects against multiple targets copying the same framework dependency at the same time. The solution | ||
| 26 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html | ||
| 27 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") | ||
| 28 | |||
| 29 | # Copies and strips a vendored framework | ||
| 30 | install_framework() | ||
| 31 | { | ||
| 32 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then | ||
| 33 | local source="${BUILT_PRODUCTS_DIR}/$1" | ||
| 34 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then | ||
| 35 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" | ||
| 36 | elif [ -r "$1" ]; then | ||
| 37 | local source="$1" | ||
| 38 | fi | ||
| 39 | |||
| 40 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" | ||
| 41 | |||
| 42 | if [ -L "${source}" ]; then | ||
| 43 | echo "Symlinked..." | ||
| 44 | source="$(readlink "${source}")" | ||
| 45 | fi | ||
| 46 | |||
| 47 | if [ -d "${source}/${BCSYMBOLMAP_DIR}" ]; then | ||
| 48 | # Locate and install any .bcsymbolmaps if present, and remove them from the .framework before the framework is copied | ||
| 49 | find "${source}/${BCSYMBOLMAP_DIR}" -name "*.bcsymbolmap"|while read f; do | ||
| 50 | echo "Installing $f" | ||
| 51 | install_bcsymbolmap "$f" "$destination" | ||
| 52 | rm "$f" | ||
| 53 | done | ||
| 54 | rmdir "${source}/${BCSYMBOLMAP_DIR}" | ||
| 55 | fi | ||
| 56 | |||
| 57 | # Use filter instead of exclude so missing patterns don't throw errors. | ||
| 58 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" | ||
| 59 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" | ||
| 60 | |||
| 61 | local basename | ||
| 62 | basename="$(basename -s .framework "$1")" | ||
| 63 | binary="${destination}/${basename}.framework/${basename}" | ||
| 64 | |||
| 65 | if ! [ -r "$binary" ]; then | ||
| 66 | binary="${destination}/${basename}" | ||
| 67 | elif [ -L "${binary}" ]; then | ||
| 68 | echo "Destination binary is symlinked..." | ||
| 69 | dirname="$(dirname "${binary}")" | ||
| 70 | binary="${dirname}/$(readlink "${binary}")" | ||
| 71 | fi | ||
| 72 | |||
| 73 | # Strip invalid architectures so "fat" simulator / device frameworks work on device | ||
| 74 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then | ||
| 75 | strip_invalid_archs "$binary" | ||
| 76 | fi | ||
| 77 | |||
| 78 | # Resign the code if required by the build settings to avoid unstable apps | ||
| 79 | code_sign_if_enabled "${destination}/$(basename "$1")" | ||
| 80 | |||
| 81 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. | ||
| 82 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then | ||
| 83 | local swift_runtime_libs | ||
| 84 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) | ||
| 85 | for lib in $swift_runtime_libs; do | ||
| 86 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" | ||
| 87 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" | ||
| 88 | code_sign_if_enabled "${destination}/${lib}" | ||
| 89 | done | ||
| 90 | fi | ||
| 91 | } | ||
| 92 | # Copies and strips a vendored dSYM | ||
| 93 | install_dsym() { | ||
| 94 | local source="$1" | ||
| 95 | warn_missing_arch=${2:-true} | ||
| 96 | if [ -r "$source" ]; then | ||
| 97 | # Copy the dSYM into the targets temp dir. | ||
| 98 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" | ||
| 99 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" | ||
| 100 | |||
| 101 | local basename | ||
| 102 | basename="$(basename -s .dSYM "$source")" | ||
| 103 | binary_name="$(ls "$source/Contents/Resources/DWARF")" | ||
| 104 | binary="${DERIVED_FILES_DIR}/${basename}.dSYM/Contents/Resources/DWARF/${binary_name}" | ||
| 105 | |||
| 106 | # Strip invalid architectures from the dSYM. | ||
| 107 | if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then | ||
| 108 | strip_invalid_archs "$binary" "$warn_missing_arch" | ||
| 109 | fi | ||
| 110 | if [[ $STRIP_BINARY_RETVAL == 0 ]]; then | ||
| 111 | # Move the stripped file into its final destination. | ||
| 112 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" | ||
| 113 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --links --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.dSYM" "${DWARF_DSYM_FOLDER_PATH}" | ||
| 114 | else | ||
| 115 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. | ||
| 116 | mkdir -p "${DWARF_DSYM_FOLDER_PATH}" | ||
| 117 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.dSYM" | ||
| 118 | fi | ||
| 119 | fi | ||
| 120 | } | ||
| 121 | |||
| 122 | # Used as a return value for each invocation of `strip_invalid_archs` function. | ||
| 123 | STRIP_BINARY_RETVAL=0 | ||
| 124 | |||
| 125 | # Strip invalid architectures | ||
| 126 | strip_invalid_archs() { | ||
| 127 | binary="$1" | ||
| 128 | warn_missing_arch=${2:-true} | ||
| 129 | # Get architectures for current target binary | ||
| 130 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" | ||
| 131 | # Intersect them with the architectures we are building for | ||
| 132 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" | ||
| 133 | # If there are no archs supported by this binary then warn the user | ||
| 134 | if [[ -z "$intersected_archs" ]]; then | ||
| 135 | if [[ "$warn_missing_arch" == "true" ]]; then | ||
| 136 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." | ||
| 137 | fi | ||
| 138 | STRIP_BINARY_RETVAL=1 | ||
| 139 | return | ||
| 140 | fi | ||
| 141 | stripped="" | ||
| 142 | for arch in $binary_archs; do | ||
| 143 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then | ||
| 144 | # Strip non-valid architectures in-place | ||
| 145 | lipo -remove "$arch" -output "$binary" "$binary" | ||
| 146 | stripped="$stripped $arch" | ||
| 147 | fi | ||
| 148 | done | ||
| 149 | if [[ "$stripped" ]]; then | ||
| 150 | echo "Stripped $binary of architectures:$stripped" | ||
| 151 | fi | ||
| 152 | STRIP_BINARY_RETVAL=0 | ||
| 153 | } | ||
| 154 | |||
| 155 | # Copies the bcsymbolmap files of a vendored framework | ||
| 156 | install_bcsymbolmap() { | ||
| 157 | local bcsymbolmap_path="$1" | ||
| 158 | local destination="${BUILT_PRODUCTS_DIR}" | ||
| 159 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" | ||
| 160 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" | ||
| 161 | } | ||
| 162 | |||
| 163 | # Signs a framework with the provided identity | ||
| 164 | code_sign_if_enabled() { | ||
| 165 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then | ||
| 166 | # Use the current code_sign_identity | ||
| 167 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" | ||
| 168 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" | ||
| 169 | |||
| 170 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then | ||
| 171 | code_sign_cmd="$code_sign_cmd &" | ||
| 172 | fi | ||
| 173 | echo "$code_sign_cmd" | ||
| 174 | eval "$code_sign_cmd" | ||
| 175 | fi | ||
| 176 | } | ||
| 177 | |||
| 178 | if [[ "$CONFIGURATION" == "Debug" ]]; then | ||
| 179 | install_framework "${BUILT_PRODUCTS_DIR}/FBSnapshotTestCase/FBSnapshotTestCase.framework" | ||
| 180 | fi | ||
| 181 | if [[ "$CONFIGURATION" == "Release" ]]; then | ||
| 182 | install_framework "${BUILT_PRODUCTS_DIR}/FBSnapshotTestCase/FBSnapshotTestCase.framework" | ||
| 183 | fi | ||
| 184 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then | ||
| 185 | wait | ||
| 186 | fi |
Example/Pods/Target Support Files/Pods-JCategoryKit_Tests/Pods-JCategoryKit_Tests-umbrella.h
0 → 100644
| 1 | #ifdef __OBJC__ | ||
| 2 | #import <UIKit/UIKit.h> | ||
| 3 | #else | ||
| 4 | #ifndef FOUNDATION_EXPORT | ||
| 5 | #if defined(__cplusplus) | ||
| 6 | #define FOUNDATION_EXPORT extern "C" | ||
| 7 | #else | ||
| 8 | #define FOUNDATION_EXPORT extern | ||
| 9 | #endif | ||
| 10 | #endif | ||
| 11 | #endif | ||
| 12 | |||
| 13 | |||
| 14 | FOUNDATION_EXPORT double Pods_JCategoryKit_TestsVersionNumber; | ||
| 15 | FOUNDATION_EXPORT const unsigned char Pods_JCategoryKit_TestsVersionString[]; | ||
| 16 |
Example/Pods/Target Support Files/Pods-JCategoryKit_Tests/Pods-JCategoryKit_Tests.debug.xcconfig
0 → 100644
| 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES | ||
| 2 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO | ||
| 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "${PODS_CONFIGURATION_BUILD_DIR}/FBSnapshotTestCase" "${PODS_CONFIGURATION_BUILD_DIR}/JCategoryKit" | ||
| 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 | ||
| 5 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FBSnapshotTestCase/FBSnapshotTestCase.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JCategoryKit/JCategoryKit.framework/Headers" | ||
| 6 | LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift "$(PLATFORM_DIR)/Developer/Library/Frameworks" '@executable_path/Frameworks' '@loader_path/Frameworks' | ||
| 7 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift | ||
| 8 | OTHER_LDFLAGS = $(inherited) -framework "FBSnapshotTestCase" -framework "Foundation" -framework "JCategoryKit" -framework "QuartzCore" -framework "UIKit" -framework "XCTest" | ||
| 9 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS | ||
| 10 | PODS_BUILD_DIR = ${BUILD_DIR} | ||
| 11 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) | ||
| 12 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. | ||
| 13 | PODS_ROOT = ${SRCROOT}/Pods | ||
| 14 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates | ||
| 15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES |
Example/Pods/Target Support Files/Pods-JCategoryKit_Tests/Pods-JCategoryKit_Tests.release.xcconfig
0 → 100644
| 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES | ||
| 2 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO | ||
| 3 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks" "${PODS_CONFIGURATION_BUILD_DIR}/FBSnapshotTestCase" "${PODS_CONFIGURATION_BUILD_DIR}/JCategoryKit" | ||
| 4 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 | ||
| 5 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/FBSnapshotTestCase/FBSnapshotTestCase.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/JCategoryKit/JCategoryKit.framework/Headers" | ||
| 6 | LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift "$(PLATFORM_DIR)/Developer/Library/Frameworks" '@executable_path/Frameworks' '@loader_path/Frameworks' | ||
| 7 | LIBRARY_SEARCH_PATHS = $(inherited) "${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift | ||
| 8 | OTHER_LDFLAGS = $(inherited) -framework "FBSnapshotTestCase" -framework "Foundation" -framework "JCategoryKit" -framework "QuartzCore" -framework "UIKit" -framework "XCTest" | ||
| 9 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS | ||
| 10 | PODS_BUILD_DIR = ${BUILD_DIR} | ||
| 11 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) | ||
| 12 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. | ||
| 13 | PODS_ROOT = ${SRCROOT}/Pods | ||
| 14 | PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates | ||
| 15 | USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES |
| ... | @@ -8,7 +8,7 @@ | ... | @@ -8,7 +8,7 @@ |
| 8 | 8 | ||
| 9 | Pod::Spec.new do |s| | 9 | Pod::Spec.new do |s| |
| 10 | s.name = 'JCategoryKit' | 10 | s.name = 'JCategoryKit' |
| 11 | s.version = '0.1.0' | 11 | s.version = '1.0.0' |
| 12 | s.summary = 'A short description of JCategoryKit.' | 12 | s.summary = 'A short description of JCategoryKit.' |
| 13 | 13 | ||
| 14 | # This description is used to generate tags and improve search results. | 14 | # This description is used to generate tags and improve search results. |
| ... | @@ -25,7 +25,7 @@ TODO: Add long description of the pod here. | ... | @@ -25,7 +25,7 @@ TODO: Add long description of the pod here. |
| 25 | # s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' | 25 | # s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' |
| 26 | s.license = { :type => 'MIT', :file => 'LICENSE' } | 26 | s.license = { :type => 'MIT', :file => 'LICENSE' } |
| 27 | s.author = { 'weixq' => 'weixiaoqiang@situdata.com' } | 27 | s.author = { 'weixq' => 'weixiaoqiang@situdata.com' } |
| 28 | s.source = { :git => 'https://github.com/weixq/JCategoryKit.git', :tag => s.version.to_s } | 28 | s.source = { :git => 'http://gitlab.situdata.com/weixiaoqiang/JCategoryKit.git', :tag => s.version.to_s } |
| 29 | # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>' | 29 | # s.social_media_url = 'https://twitter.com/<TWITTER_USERNAME>' |
| 30 | 30 | ||
| 31 | s.ios.deployment_target = '9.0' | 31 | s.ios.deployment_target = '9.0' | ... | ... |
JCategoryKit/Classes/Person.h
0 → 100644
JCategoryKit/Classes/Person.m
0 → 100644
JCategoryKit/Classes/ReplaceMe.m
deleted
100644 → 0
File mode changed
LICENSE 2
0 → 100644
| 1 | This project is licensed under the MIT license. | ||
| 2 | |||
| 3 | Copyright (c) 2013 - 2014 CocoaPods Dev Team | ||
| 4 | |||
| 5 | Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| 6 | of this software and associated documentation files (the "Software"), to deal | ||
| 7 | in the Software without restriction, including without limitation the rights | ||
| 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
| 9 | copies of the Software, and to permit persons to whom the Software is | ||
| 10 | furnished to do so, subject to the following conditions: | ||
| 11 | |||
| 12 | The above copyright notice and this permission notice shall be included in | ||
| 13 | all copies or substantial portions of the Software. | ||
| 14 | |||
| 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
| 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
| 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||
| 21 | THE SOFTWARE. |
-
Please register or sign in to post a comment