ab87c9fd by 魏小强

ceshi

1 parent acaa02c1
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 */ = {
......
1 <?xml version="1.0" encoding="UTF-8"?>
2 <Workspace
3 version = "1.0">
4 <FileRef
5 location = "group:JCategoryKit.xcodeproj">
6 </FileRef>
7 <FileRef
8 location = "group:Pods/Pods.xcodeproj">
9 </FileRef>
10 </Workspace>
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>IDEDidComputeMac32BitWarning</key>
6 <true/>
7 </dict>
8 </plist>
...@@ -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
......
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
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
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
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.
1 FBSnapshotTestCase
2 ======================
3
4 [![Build Status](https://travis-ci.org/facebook/ios-snapshot-test-case.svg)](https://travis-ci.org/facebook/ios-snapshot-test-case) [![Cocoa Pod Version](https://cocoapod-badges.herokuapp.com/v/FBSnapshotTestCase/badge.svg)](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 ![](FBSnapshotTestCaseDemo/Scheme_FB_REFERENCE_IMAGE_DIR.png)
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 }
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
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 #import <Foundation/Foundation.h>
2 @interface PodsDummy_FBSnapshotTestCase : NSObject
3 @end
4 @implementation PodsDummy_FBSnapshotTestCase
5 @end
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
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 framework module FBSnapshotTestCase {
2 umbrella header "FBSnapshotTestCase-umbrella.h"
3
4 export *
5 module * { export * }
6 }
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 #import <Foundation/Foundation.h>
2 @interface PodsDummy_JCategoryKit : NSObject
3 @end
4 @implementation PodsDummy_JCategoryKit
5 @end
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
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 framework module JCategoryKit {
2 umbrella header "JCategoryKit-umbrella.h"
3
4 export *
5 module * { export * }
6 }
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 <?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 &lt;weixiaoqiang@situdata.com&gt;
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>
1 #import <Foundation/Foundation.h>
2 @interface PodsDummy_Pods_JCategoryKit_Example : NSObject
3 @end
4 @implementation PodsDummy_Pods_JCategoryKit_Example
5 @end
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
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
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 framework module Pods_JCategoryKit_Example {
2 umbrella header "Pods-JCategoryKit_Example-umbrella.h"
3
4 export *
5 module * { export * }
6 }
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 <?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>
1 #import <Foundation/Foundation.h>
2 @interface PodsDummy_Pods_JCategoryKit_Tests : NSObject
3 @end
4 @implementation PodsDummy_Pods_JCategoryKit_Tests
5 @end
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
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
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
1 framework module Pods_JCategoryKit_Tests {
2 umbrella header "Pods-JCategoryKit_Tests-umbrella.h"
3
4 export *
5 module * { export * }
6 }
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'
......
1 //
2 // Person.h
3 // FBSnapshotTestCase
4 //
5 // Created by weixq on 2021/12/21.
6 //
7
8 #import <Foundation/Foundation.h>
9
10 NS_ASSUME_NONNULL_BEGIN
11
12 @interface Person : NSObject
13 -(void)eat;
14 @end
15
16 NS_ASSUME_NONNULL_END
1 //
2 // Person.m
3 // FBSnapshotTestCase
4 //
5 // Created by weixq on 2021/12/21.
6 //
7
8 #import "Person.h"
9
10 @implementation Person
11 -(void)eat{
12 NSLog(@"eat");
13 }
14 @end
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.
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!