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