xcunique 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +23 -0
  3. data/Gemfile +4 -0
  4. data/Guardfile +22 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +73 -0
  7. data/Rakefile +11 -0
  8. data/bin/xcunique +5 -0
  9. data/lib/json2plist/json2plist +21 -0
  10. data/lib/xcunique.rb +23 -0
  11. data/lib/xcunique/cli.rb +40 -0
  12. data/lib/xcunique/hash_ext.rb +25 -0
  13. data/lib/xcunique/helpers.rb +26 -0
  14. data/lib/xcunique/options.rb +68 -0
  15. data/lib/xcunique/parser.rb +54 -0
  16. data/lib/xcunique/sorter.rb +51 -0
  17. data/lib/xcunique/uniquifier.rb +36 -0
  18. data/lib/xcunique/version.rb +3 -0
  19. data/spec/fixtures/TestProject.json +548 -0
  20. data/spec/fixtures/TestProject/TestProject.xcodeproj/project.pbxproj +510 -0
  21. data/spec/fixtures/TestProject/TestProject.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  22. data/spec/fixtures/TestProject/TestProject.xcodeproj/project.xcworkspace/xcuserdata/paul.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  23. data/spec/fixtures/TestProject/TestProject.xcodeproj/xcuserdata/paul.xcuserdatad/xcschemes/TestProject.xcscheme +111 -0
  24. data/spec/fixtures/TestProject/TestProject.xcodeproj/xcuserdata/paul.xcuserdatad/xcschemes/xcschememanagement.plist +47 -0
  25. data/spec/fixtures/TestProject/TestProject/AppDelegate.swift +46 -0
  26. data/spec/fixtures/TestProject/TestProject/Assets.xcassets/AppIcon.appiconset/Contents.json +68 -0
  27. data/spec/fixtures/TestProject/TestProject/Base.lproj/LaunchScreen.storyboard +27 -0
  28. data/spec/fixtures/TestProject/TestProject/Base.lproj/Main.storyboard +26 -0
  29. data/spec/fixtures/TestProject/TestProject/Info.plist +47 -0
  30. data/spec/fixtures/TestProject/TestProject/ViewController.swift +25 -0
  31. data/spec/fixtures/TestProject/TestProjectTests/Info.plist +24 -0
  32. data/spec/fixtures/TestProject/TestProjectTests/TestProjectTests.swift +36 -0
  33. data/spec/fixtures/TestProject/TestProjectUITests/Info.plist +24 -0
  34. data/spec/fixtures/TestProject/TestProjectUITests/TestProjectUITests.swift +36 -0
  35. data/spec/spec_helper.rb +4 -0
  36. data/spec/xcunique/hash_ext_spec.rb +36 -0
  37. data/spec/xcunique/helpers_spec.rb +58 -0
  38. data/spec/xcunique/parser_spec.rb +214 -0
  39. data/spec/xcunique/sorter_spec.rb +116 -0
  40. data/xcunique.gemspec +26 -0
  41. metadata +178 -0
@@ -0,0 +1,51 @@
1
+ module Xcunique
2
+
3
+ # Sorter traverses the objects in the project and sorts keys that are listed
4
+ # in the `SORTABLE_ITEMS` array
5
+ class Sorter
6
+ # The keys within the project that should be supported
7
+ SORTABLE_ITEMS = [ Keys::CHILDREN, Keys::FILES ]
8
+
9
+ # Keys that could be sorted in future
10
+ UNSUPPORTED_SORTABLE_ITEMS = %w(buildConfigurations targets)
11
+
12
+ # Returns a new instance of Sorter
13
+ #
14
+ # @param project [Hash] the project to sort
15
+ def initialize project
16
+ @project = project.deep_dup
17
+ @objects = @project[Keys::OBJECTS]
18
+ end
19
+
20
+ # Traverses the objects in the project clone and sorts in place
21
+ # objects that are held under the `SORTABLE_ITEMS` keys
22
+ #
23
+ # @return [Hash] a sorted project
24
+ def sort
25
+ objects.values.each do |object|
26
+ SORTABLE_ITEMS.select { |key| object.has_key?(key) }.each do |key|
27
+ object[key].sort_by!(&method(:comparator))
28
+ end
29
+ end
30
+ project
31
+ end
32
+
33
+ private
34
+
35
+ attr_accessor :objects, :project
36
+
37
+ # The comparator used during the sort
38
+ #
39
+ # The comparator resolves the attributes for the node and appends a
40
+ # known prefix to objects where `isa = PBXGroup` to ensure that groups
41
+ # are sorted above files
42
+ #
43
+ # @param uuid [String] the uuid of the object to examine
44
+ # @!visibility public
45
+ def comparator uuid
46
+ prefix = objects[uuid][Keys::ISA] == Keys::PBXGroup ? ' ' : ''
47
+ prefix + Helpers.resolve_attributes(uuid, objects)
48
+ end
49
+
50
+ end
51
+ end
@@ -0,0 +1,36 @@
1
+ require 'json'
2
+ require 'digest/md5'
3
+
4
+ module Xcunique
5
+
6
+ # Uniquifier coordinates the overall process of parsing and substituting the new deterministic keys
7
+ class Uniquifier
8
+
9
+ # @param project_path [String] the path of the project.pbxproj file
10
+ def initialize project_path
11
+ @project = JSON.parse(`plutil -convert json -o - #{project_path}`)
12
+ end
13
+
14
+ # Coordinates the overall process of parsing and substituting the new deterministic keys
15
+ #
16
+ # Files/Groups are parsed first with their path being rooted at the `mainGroup`
17
+ # this prevents the path to a file potentially being changed by other project settings
18
+ #
19
+ # @return [Hash] a unqiued project object
20
+ def uniquify
21
+ root_uuid = project[Keys::ROOT_OBJECT]
22
+ main_group = project[Keys::OBJECTS][root_uuid][Keys::MAIN_GROUP]
23
+
24
+ parser = Parser.new(project)
25
+ parser.parse object: main_group
26
+ parser.parse object: root_uuid
27
+
28
+ project.deep_dup substitutions: Hash[parser.visited.map { |uuid, path| [ uuid, Digest::MD5.hexdigest(path) ] }]
29
+ end
30
+
31
+ private
32
+
33
+ attr_reader :project
34
+
35
+ end
36
+ end
@@ -0,0 +1,3 @@
1
+ module Xcunique
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,548 @@
1
+ {
2
+ "classes": {},
3
+ "objectVersion": "46",
4
+ "archiveVersion": "1",
5
+ "objects": {
6
+ "DACE56AC1C24A14D00E6ABB0": {
7
+ "path": "Info.plist",
8
+ "isa": "PBXFileReference",
9
+ "lastKnownFileType": "text.plist.xml",
10
+ "sourceTree": "<group>"
11
+ },
12
+ "DACE56B91C24A14D00E6ABB0": {
13
+ "isa": "XCBuildConfiguration",
14
+ "buildSettings": {
15
+ "CLANG_WARN_ENUM_CONVERSION": "YES",
16
+ "GCC_WARN_UNUSED_VARIABLE": "YES",
17
+ "VALIDATE_PRODUCT": "YES",
18
+ "GCC_WARN_ABOUT_RETURN_TYPE": "YES_ERROR",
19
+ "CLANG_ENABLE_MODULES": "YES",
20
+ "CLANG_CXX_LANGUAGE_STANDARD": "gnu++0x",
21
+ "GCC_NO_COMMON_BLOCKS": "YES",
22
+ "GCC_WARN_UNINITIALIZED_AUTOS": "YES_AGGRESSIVE",
23
+ "CLANG_WARN_INT_CONVERSION": "YES",
24
+ "MTL_ENABLE_DEBUG_INFO": "NO",
25
+ "CLANG_WARN_CONSTANT_CONVERSION": "YES",
26
+ "DEBUG_INFORMATION_FORMAT": "dwarf-with-dsym",
27
+ "GCC_C_LANGUAGE_STANDARD": "gnu99",
28
+ "CLANG_WARN__DUPLICATE_METHOD_MATCH": "YES",
29
+ "CLANG_WARN_EMPTY_BODY": "YES",
30
+ "GCC_WARN_64_TO_32_BIT_CONVERSION": "YES",
31
+ "TARGETED_DEVICE_FAMILY": "1,2",
32
+ "ALWAYS_SEARCH_USER_PATHS": "NO",
33
+ "COPY_PHASE_STRIP": "NO",
34
+ "CLANG_ENABLE_OBJC_ARC": "YES",
35
+ "CLANG_WARN_BOOL_CONVERSION": "YES",
36
+ "CLANG_WARN_DIRECT_OBJC_ISA_USAGE": "YES_ERROR",
37
+ "GCC_WARN_UNUSED_FUNCTION": "YES",
38
+ "CLANG_WARN_OBJC_ROOT_CLASS": "YES_ERROR",
39
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]": "iPhone Developer",
40
+ "ENABLE_NS_ASSERTIONS": "NO",
41
+ "IPHONEOS_DEPLOYMENT_TARGET": "9.1",
42
+ "SDKROOT": "iphoneos",
43
+ "CLANG_CXX_LIBRARY": "libc++",
44
+ "ENABLE_STRICT_OBJC_MSGSEND": "YES",
45
+ "CLANG_WARN_UNREACHABLE_CODE": "YES",
46
+ "GCC_WARN_UNDECLARED_SELECTOR": "YES"
47
+ },
48
+ "name": "Release"
49
+ },
50
+ "DACE56BC1C24A14D00E6ABB0": {
51
+ "isa": "XCBuildConfiguration",
52
+ "buildSettings": {
53
+ "INFOPLIST_FILE": "TestProject\/Info.plist",
54
+ "PRODUCT_BUNDLE_IDENTIFIER": "com.paul-samuels.TestProject",
55
+ "ASSETCATALOG_COMPILER_APPICON_NAME": "AppIcon",
56
+ "LD_RUNPATH_SEARCH_PATHS": "$(inherited) @executable_path\/Frameworks",
57
+ "PRODUCT_NAME": "$(TARGET_NAME)"
58
+ },
59
+ "name": "Release"
60
+ },
61
+ "DACE568D1C24A14C00E6ABB0": {
62
+ "isa": "XCConfigurationList",
63
+ "defaultConfigurationIsVisible": "0",
64
+ "defaultConfigurationName": "Release",
65
+ "buildConfigurations": [
66
+ "DACE56B81C24A14D00E6ABB0",
67
+ "DACE56B91C24A14D00E6ABB0"
68
+ ]
69
+ },
70
+ "DACE56931C24A14D00E6ABB0": {
71
+ "isa": "PBXGroup",
72
+ "name": "Products",
73
+ "children": [
74
+ "DACE56921C24A14D00E6ABB0",
75
+ "DACE56A61C24A14D00E6ABB0",
76
+ "DACE56B11C24A14D00E6ABB0"
77
+ ],
78
+ "sourceTree": "<group>"
79
+ },
80
+ "DACE56A61C24A14D00E6ABB0": {
81
+ "path": "TestProjectTests.xctest",
82
+ "isa": "PBXFileReference",
83
+ "includeInIndex": "0",
84
+ "explicitFileType": "wrapper.cfbundle",
85
+ "sourceTree": "BUILT_PRODUCTS_DIR"
86
+ },
87
+ "DACE568A1C24A14C00E6ABB0": {
88
+ "buildConfigurationList": "DACE568D1C24A14C00E6ABB0",
89
+ "targets": [
90
+ "DACE56911C24A14D00E6ABB0",
91
+ "DACE56A51C24A14D00E6ABB0",
92
+ "DACE56B01C24A14D00E6ABB0"
93
+ ],
94
+ "developmentRegion": "English",
95
+ "knownRegions": [
96
+ "en",
97
+ "Base"
98
+ ],
99
+ "isa": "PBXProject",
100
+ "compatibilityVersion": "Xcode 3.2",
101
+ "productRefGroup": "DACE56931C24A14D00E6ABB0",
102
+ "projectDirPath": "",
103
+ "attributes": {
104
+ "LastSwiftUpdateCheck": "0710",
105
+ "LastUpgradeCheck": "0710",
106
+ "ORGANIZATIONNAME": "Paul Samuels",
107
+ "TargetAttributes": {
108
+ "DACE56B01C24A14D00E6ABB0": {
109
+ "TestTargetID": "DACE56911C24A14D00E6ABB0",
110
+ "CreatedOnToolsVersion": "7.1.1"
111
+ },
112
+ "DACE56911C24A14D00E6ABB0": {
113
+ "CreatedOnToolsVersion": "7.1.1"
114
+ },
115
+ "DACE56A51C24A14D00E6ABB0": {
116
+ "TestTargetID": "DACE56911C24A14D00E6ABB0",
117
+ "CreatedOnToolsVersion": "7.1.1"
118
+ }
119
+ }
120
+ },
121
+ "hasScannedForEncodings": "0",
122
+ "projectRoot": "",
123
+ "mainGroup": "DACE56891C24A14C00E6ABB0"
124
+ },
125
+ "DACE56B61C24A14D00E6ABB0": {
126
+ "isa": "PBXBuildFile",
127
+ "fileRef": "DACE56B51C24A14D00E6ABB0"
128
+ },
129
+ "DACE569D1C24A14D00E6ABB0": {
130
+ "isa": "PBXBuildFile",
131
+ "fileRef": "DACE569C1C24A14D00E6ABB0"
132
+ },
133
+ "DACE56901C24A14D00E6ABB0": {
134
+ "isa": "PBXResourcesBuildPhase",
135
+ "buildActionMask": "2147483647",
136
+ "files": [
137
+ "DACE56A01C24A14D00E6ABB0",
138
+ "DACE569D1C24A14D00E6ABB0",
139
+ "DACE569B1C24A14D00E6ABB0"
140
+ ],
141
+ "runOnlyForDeploymentPostprocessing": "0"
142
+ },
143
+ "DACE56A31C24A14D00E6ABB0": {
144
+ "isa": "PBXFrameworksBuildPhase",
145
+ "buildActionMask": "2147483647",
146
+ "files": [],
147
+ "runOnlyForDeploymentPostprocessing": "0"
148
+ },
149
+ "DACE56B31C24A14D00E6ABB0": {
150
+ "isa": "PBXTargetDependency",
151
+ "target": "DACE56911C24A14D00E6ABB0",
152
+ "targetProxy": "DACE56B21C24A14D00E6ABB0"
153
+ },
154
+ "DACE569A1C24A14D00E6ABB0": {
155
+ "path": "Base.lproj\/Main.storyboard",
156
+ "isa": "PBXFileReference",
157
+ "name": "Base",
158
+ "lastKnownFileType": "file.storyboard",
159
+ "sourceTree": "<group>"
160
+ },
161
+ "DACE56971C24A14D00E6ABB0": {
162
+ "path": "ViewController.swift",
163
+ "isa": "PBXFileReference",
164
+ "lastKnownFileType": "sourcecode.swift",
165
+ "sourceTree": "<group>"
166
+ },
167
+ "DACE56AD1C24A14D00E6ABB0": {
168
+ "isa": "PBXSourcesBuildPhase",
169
+ "buildActionMask": "2147483647",
170
+ "files": [
171
+ "DACE56B61C24A14D00E6ABB0"
172
+ ],
173
+ "runOnlyForDeploymentPostprocessing": "0"
174
+ },
175
+ "DACE56A01C24A14D00E6ABB0": {
176
+ "isa": "PBXBuildFile",
177
+ "fileRef": "DACE569E1C24A14D00E6ABB0"
178
+ },
179
+ "DACE56BD1C24A14D00E6ABB0": {
180
+ "isa": "XCConfigurationList",
181
+ "buildConfigurations": [
182
+ "DACE56BE1C24A14D00E6ABB0",
183
+ "DACE56BF1C24A14D00E6ABB0"
184
+ ],
185
+ "defaultConfigurationIsVisible": "0"
186
+ },
187
+ "DACE56B01C24A14D00E6ABB0": {
188
+ "buildConfigurationList": "DACE56C01C24A14D00E6ABB0",
189
+ "productReference": "DACE56B11C24A14D00E6ABB0",
190
+ "productType": "com.apple.product-type.bundle.ui-testing",
191
+ "productName": "TestProjectUITests",
192
+ "isa": "PBXNativeTarget",
193
+ "buildPhases": [
194
+ "DACE56AD1C24A14D00E6ABB0",
195
+ "DACE56AE1C24A14D00E6ABB0",
196
+ "DACE56AF1C24A14D00E6ABB0"
197
+ ],
198
+ "dependencies": [
199
+ "DACE56B31C24A14D00E6ABB0"
200
+ ],
201
+ "name": "TestProjectUITests",
202
+ "buildRules": []
203
+ },
204
+ "DACE56C01C24A14D00E6ABB0": {
205
+ "isa": "XCConfigurationList",
206
+ "buildConfigurations": [
207
+ "DACE56C11C24A14D00E6ABB0",
208
+ "DACE56C21C24A14D00E6ABB0"
209
+ ],
210
+ "defaultConfigurationIsVisible": "0"
211
+ },
212
+ "DACE56941C24A14D00E6ABB0": {
213
+ "path": "TestProject",
214
+ "isa": "PBXGroup",
215
+ "children": [
216
+ "DACE56951C24A14D00E6ABB0",
217
+ "DACE56971C24A14D00E6ABB0",
218
+ "DACE56991C24A14D00E6ABB0",
219
+ "DACE569C1C24A14D00E6ABB0",
220
+ "DACE569E1C24A14D00E6ABB0",
221
+ "DACE56A11C24A14D00E6ABB0"
222
+ ],
223
+ "sourceTree": "<group>"
224
+ },
225
+ "DACE56A71C24A14D00E6ABB0": {
226
+ "isa": "PBXContainerItemProxy",
227
+ "containerPortal": "DACE568A1C24A14C00E6ABB0",
228
+ "remoteGlobalIDString": "DACE56911C24A14D00E6ABB0",
229
+ "remoteInfo": "TestProject",
230
+ "proxyType": "1"
231
+ },
232
+ "DACE56AA1C24A14D00E6ABB0": {
233
+ "path": "TestProjectTests.swift",
234
+ "isa": "PBXFileReference",
235
+ "lastKnownFileType": "sourcecode.swift",
236
+ "sourceTree": "<group>"
237
+ },
238
+ "DACE56B71C24A14D00E6ABB0": {
239
+ "path": "Info.plist",
240
+ "isa": "PBXFileReference",
241
+ "lastKnownFileType": "text.plist.xml",
242
+ "sourceTree": "<group>"
243
+ },
244
+ "DACE56BA1C24A14D00E6ABB0": {
245
+ "isa": "XCConfigurationList",
246
+ "buildConfigurations": [
247
+ "DACE56BB1C24A14D00E6ABB0",
248
+ "DACE56BC1C24A14D00E6ABB0"
249
+ ],
250
+ "defaultConfigurationIsVisible": "0"
251
+ },
252
+ "DACE568E1C24A14D00E6ABB0": {
253
+ "isa": "PBXSourcesBuildPhase",
254
+ "buildActionMask": "2147483647",
255
+ "files": [
256
+ "DACE56981C24A14D00E6ABB0",
257
+ "DACE56961C24A14D00E6ABB0"
258
+ ],
259
+ "runOnlyForDeploymentPostprocessing": "0"
260
+ },
261
+ "DACE569E1C24A14D00E6ABB0": {
262
+ "isa": "PBXVariantGroup",
263
+ "name": "LaunchScreen.storyboard",
264
+ "children": [
265
+ "DACE569F1C24A14D00E6ABB0"
266
+ ],
267
+ "sourceTree": "<group>"
268
+ },
269
+ "DACE56911C24A14D00E6ABB0": {
270
+ "buildConfigurationList": "DACE56BA1C24A14D00E6ABB0",
271
+ "productReference": "DACE56921C24A14D00E6ABB0",
272
+ "productType": "com.apple.product-type.application",
273
+ "productName": "TestProject",
274
+ "isa": "PBXNativeTarget",
275
+ "buildPhases": [
276
+ "DACE568E1C24A14D00E6ABB0",
277
+ "DACE568F1C24A14D00E6ABB0",
278
+ "DACE56901C24A14D00E6ABB0"
279
+ ],
280
+ "dependencies": [],
281
+ "name": "TestProject",
282
+ "buildRules": []
283
+ },
284
+ "DACE56A41C24A14D00E6ABB0": {
285
+ "isa": "PBXResourcesBuildPhase",
286
+ "buildActionMask": "2147483647",
287
+ "files": [],
288
+ "runOnlyForDeploymentPostprocessing": "0"
289
+ },
290
+ "DACE56B41C24A14D00E6ABB0": {
291
+ "path": "TestProjectUITests",
292
+ "isa": "PBXGroup",
293
+ "children": [
294
+ "DACE56B51C24A14D00E6ABB0",
295
+ "DACE56B71C24A14D00E6ABB0"
296
+ ],
297
+ "sourceTree": "<group>"
298
+ },
299
+ "DACE569B1C24A14D00E6ABB0": {
300
+ "isa": "PBXBuildFile",
301
+ "fileRef": "DACE56991C24A14D00E6ABB0"
302
+ },
303
+ "DACE56981C24A14D00E6ABB0": {
304
+ "isa": "PBXBuildFile",
305
+ "fileRef": "DACE56971C24A14D00E6ABB0"
306
+ },
307
+ "DACE56AE1C24A14D00E6ABB0": {
308
+ "isa": "PBXFrameworksBuildPhase",
309
+ "buildActionMask": "2147483647",
310
+ "files": [],
311
+ "runOnlyForDeploymentPostprocessing": "0"
312
+ },
313
+ "DACE56A11C24A14D00E6ABB0": {
314
+ "path": "Info.plist",
315
+ "isa": "PBXFileReference",
316
+ "lastKnownFileType": "text.plist.xml",
317
+ "sourceTree": "<group>"
318
+ },
319
+ "DACE56BE1C24A14D00E6ABB0": {
320
+ "isa": "XCBuildConfiguration",
321
+ "buildSettings": {
322
+ "INFOPLIST_FILE": "TestProjectTests\/Info.plist",
323
+ "BUNDLE_LOADER": "$(TEST_HOST)",
324
+ "TEST_HOST": "$(BUILT_PRODUCTS_DIR)\/TestProject.app\/TestProject",
325
+ "PRODUCT_BUNDLE_IDENTIFIER": "com.paul-samuels.TestProjectTests",
326
+ "LD_RUNPATH_SEARCH_PATHS": "$(inherited) @executable_path\/Frameworks @loader_path\/Frameworks",
327
+ "PRODUCT_NAME": "$(TARGET_NAME)"
328
+ },
329
+ "name": "Debug"
330
+ },
331
+ "DACE56B11C24A14D00E6ABB0": {
332
+ "path": "TestProjectUITests.xctest",
333
+ "isa": "PBXFileReference",
334
+ "includeInIndex": "0",
335
+ "explicitFileType": "wrapper.cfbundle",
336
+ "sourceTree": "BUILT_PRODUCTS_DIR"
337
+ },
338
+ "DACE56C11C24A14D00E6ABB0": {
339
+ "isa": "XCBuildConfiguration",
340
+ "buildSettings": {
341
+ "INFOPLIST_FILE": "TestProjectUITests\/Info.plist",
342
+ "TEST_TARGET_NAME": "TestProject",
343
+ "PRODUCT_BUNDLE_IDENTIFIER": "com.paul-samuels.TestProjectUITests",
344
+ "LD_RUNPATH_SEARCH_PATHS": "$(inherited) @executable_path\/Frameworks @loader_path\/Frameworks",
345
+ "USES_XCTRUNNER": "YES",
346
+ "PRODUCT_NAME": "$(TARGET_NAME)"
347
+ },
348
+ "name": "Debug"
349
+ },
350
+ "DACE56951C24A14D00E6ABB0": {
351
+ "path": "AppDelegate.swift",
352
+ "isa": "PBXFileReference",
353
+ "lastKnownFileType": "sourcecode.swift",
354
+ "sourceTree": "<group>"
355
+ },
356
+ "DACE56AB1C24A14D00E6ABB0": {
357
+ "isa": "PBXBuildFile",
358
+ "fileRef": "DACE56AA1C24A14D00E6ABB0"
359
+ },
360
+ "DACE56A81C24A14D00E6ABB0": {
361
+ "isa": "PBXTargetDependency",
362
+ "target": "DACE56911C24A14D00E6ABB0",
363
+ "targetProxy": "DACE56A71C24A14D00E6ABB0"
364
+ },
365
+ "DACE56BB1C24A14D00E6ABB0": {
366
+ "isa": "XCBuildConfiguration",
367
+ "buildSettings": {
368
+ "INFOPLIST_FILE": "TestProject\/Info.plist",
369
+ "PRODUCT_BUNDLE_IDENTIFIER": "com.paul-samuels.TestProject",
370
+ "ASSETCATALOG_COMPILER_APPICON_NAME": "AppIcon",
371
+ "LD_RUNPATH_SEARCH_PATHS": "$(inherited) @executable_path\/Frameworks",
372
+ "PRODUCT_NAME": "$(TARGET_NAME)"
373
+ },
374
+ "name": "Debug"
375
+ },
376
+ "DACE56B81C24A14D00E6ABB0": {
377
+ "isa": "XCBuildConfiguration",
378
+ "buildSettings": {
379
+ "GCC_WARN_UNDECLARED_SELECTOR": "YES",
380
+ "CLANG_ENABLE_OBJC_ARC": "YES",
381
+ "CLANG_WARN_DIRECT_OBJC_ISA_USAGE": "YES_ERROR",
382
+ "CLANG_WARN__DUPLICATE_METHOD_MATCH": "YES",
383
+ "CODE_SIGN_IDENTITY[sdk=iphoneos*]": "iPhone Developer",
384
+ "SDKROOT": "iphoneos",
385
+ "CLANG_CXX_LANGUAGE_STANDARD": "gnu++0x",
386
+ "ENABLE_TESTABILITY": "YES",
387
+ "CLANG_WARN_BOOL_CONVERSION": "YES",
388
+ "CLANG_WARN_UNREACHABLE_CODE": "YES",
389
+ "ENABLE_STRICT_OBJC_MSGSEND": "YES",
390
+ "GCC_PREPROCESSOR_DEFINITIONS": [
391
+ "DEBUG=1",
392
+ "$(inherited)"
393
+ ],
394
+ "CLANG_WARN_ENUM_CONVERSION": "YES",
395
+ "GCC_WARN_64_TO_32_BIT_CONVERSION": "YES",
396
+ "GCC_WARN_UNINITIALIZED_AUTOS": "YES_AGGRESSIVE",
397
+ "CLANG_WARN_EMPTY_BODY": "YES",
398
+ "GCC_WARN_ABOUT_RETURN_TYPE": "YES_ERROR",
399
+ "GCC_DYNAMIC_NO_PIC": "NO",
400
+ "GCC_WARN_UNUSED_VARIABLE": "YES",
401
+ "GCC_C_LANGUAGE_STANDARD": "gnu99",
402
+ "CLANG_ENABLE_MODULES": "YES",
403
+ "GCC_NO_COMMON_BLOCKS": "YES",
404
+ "CLANG_WARN_INT_CONVERSION": "YES",
405
+ "MTL_ENABLE_DEBUG_INFO": "YES",
406
+ "ALWAYS_SEARCH_USER_PATHS": "NO",
407
+ "CLANG_WARN_OBJC_ROOT_CLASS": "YES_ERROR",
408
+ "GCC_OPTIMIZATION_LEVEL": "0",
409
+ "CLANG_WARN_CONSTANT_CONVERSION": "YES",
410
+ "COPY_PHASE_STRIP": "NO",
411
+ "SWIFT_OPTIMIZATION_LEVEL": "-Onone",
412
+ "TARGETED_DEVICE_FAMILY": "1,2",
413
+ "ONLY_ACTIVE_ARCH": "YES",
414
+ "GCC_WARN_UNUSED_FUNCTION": "YES",
415
+ "DEBUG_INFORMATION_FORMAT": "dwarf",
416
+ "IPHONEOS_DEPLOYMENT_TARGET": "9.1",
417
+ "CLANG_CXX_LIBRARY": "libc++"
418
+ },
419
+ "name": "Debug"
420
+ },
421
+ "DACE56891C24A14C00E6ABB0": {
422
+ "isa": "PBXGroup",
423
+ "sourceTree": "<group>",
424
+ "children": [
425
+ "DACE56941C24A14D00E6ABB0",
426
+ "DACE56A91C24A14D00E6ABB0",
427
+ "DACE56B41C24A14D00E6ABB0",
428
+ "DACE56931C24A14D00E6ABB0"
429
+ ]
430
+ },
431
+ "DACE568F1C24A14D00E6ABB0": {
432
+ "isa": "PBXFrameworksBuildPhase",
433
+ "buildActionMask": "2147483647",
434
+ "files": [],
435
+ "runOnlyForDeploymentPostprocessing": "0"
436
+ },
437
+ "DACE569F1C24A14D00E6ABB0": {
438
+ "path": "Base.lproj\/LaunchScreen.storyboard",
439
+ "isa": "PBXFileReference",
440
+ "name": "Base",
441
+ "lastKnownFileType": "file.storyboard",
442
+ "sourceTree": "<group>"
443
+ },
444
+ "DACE56921C24A14D00E6ABB0": {
445
+ "path": "TestProject.app",
446
+ "isa": "PBXFileReference",
447
+ "includeInIndex": "0",
448
+ "explicitFileType": "wrapper.application",
449
+ "sourceTree": "BUILT_PRODUCTS_DIR"
450
+ },
451
+ "DACE56A51C24A14D00E6ABB0": {
452
+ "buildConfigurationList": "DACE56BD1C24A14D00E6ABB0",
453
+ "productReference": "DACE56A61C24A14D00E6ABB0",
454
+ "productType": "com.apple.product-type.bundle.unit-test",
455
+ "productName": "TestProjectTests",
456
+ "isa": "PBXNativeTarget",
457
+ "buildPhases": [
458
+ "DACE56A21C24A14D00E6ABB0",
459
+ "DACE56A31C24A14D00E6ABB0",
460
+ "DACE56A41C24A14D00E6ABB0"
461
+ ],
462
+ "dependencies": [
463
+ "DACE56A81C24A14D00E6ABB0"
464
+ ],
465
+ "name": "TestProjectTests",
466
+ "buildRules": []
467
+ },
468
+ "DACE56B51C24A14D00E6ABB0": {
469
+ "path": "TestProjectUITests.swift",
470
+ "isa": "PBXFileReference",
471
+ "lastKnownFileType": "sourcecode.swift",
472
+ "sourceTree": "<group>"
473
+ },
474
+ "DACE56991C24A14D00E6ABB0": {
475
+ "isa": "PBXVariantGroup",
476
+ "name": "Main.storyboard",
477
+ "children": [
478
+ "DACE569A1C24A14D00E6ABB0"
479
+ ],
480
+ "sourceTree": "<group>"
481
+ },
482
+ "DACE569C1C24A14D00E6ABB0": {
483
+ "path": "Assets.xcassets",
484
+ "isa": "PBXFileReference",
485
+ "lastKnownFileType": "folder.assetcatalog",
486
+ "sourceTree": "<group>"
487
+ },
488
+ "DACE56AF1C24A14D00E6ABB0": {
489
+ "isa": "PBXResourcesBuildPhase",
490
+ "buildActionMask": "2147483647",
491
+ "files": [],
492
+ "runOnlyForDeploymentPostprocessing": "0"
493
+ },
494
+ "DACE56A21C24A14D00E6ABB0": {
495
+ "isa": "PBXSourcesBuildPhase",
496
+ "buildActionMask": "2147483647",
497
+ "files": [
498
+ "DACE56AB1C24A14D00E6ABB0"
499
+ ],
500
+ "runOnlyForDeploymentPostprocessing": "0"
501
+ },
502
+ "DACE56BF1C24A14D00E6ABB0": {
503
+ "isa": "XCBuildConfiguration",
504
+ "buildSettings": {
505
+ "INFOPLIST_FILE": "TestProjectTests\/Info.plist",
506
+ "BUNDLE_LOADER": "$(TEST_HOST)",
507
+ "TEST_HOST": "$(BUILT_PRODUCTS_DIR)\/TestProject.app\/TestProject",
508
+ "PRODUCT_BUNDLE_IDENTIFIER": "com.paul-samuels.TestProjectTests",
509
+ "LD_RUNPATH_SEARCH_PATHS": "$(inherited) @executable_path\/Frameworks @loader_path\/Frameworks",
510
+ "PRODUCT_NAME": "$(TARGET_NAME)"
511
+ },
512
+ "name": "Release"
513
+ },
514
+ "DACE56B21C24A14D00E6ABB0": {
515
+ "isa": "PBXContainerItemProxy",
516
+ "containerPortal": "DACE568A1C24A14C00E6ABB0",
517
+ "remoteGlobalIDString": "DACE56911C24A14D00E6ABB0",
518
+ "remoteInfo": "TestProject",
519
+ "proxyType": "1"
520
+ },
521
+ "DACE56C21C24A14D00E6ABB0": {
522
+ "isa": "XCBuildConfiguration",
523
+ "buildSettings": {
524
+ "INFOPLIST_FILE": "TestProjectUITests\/Info.plist",
525
+ "TEST_TARGET_NAME": "TestProject",
526
+ "PRODUCT_BUNDLE_IDENTIFIER": "com.paul-samuels.TestProjectUITests",
527
+ "LD_RUNPATH_SEARCH_PATHS": "$(inherited) @executable_path\/Frameworks @loader_path\/Frameworks",
528
+ "USES_XCTRUNNER": "YES",
529
+ "PRODUCT_NAME": "$(TARGET_NAME)"
530
+ },
531
+ "name": "Release"
532
+ },
533
+ "DACE56961C24A14D00E6ABB0": {
534
+ "isa": "PBXBuildFile",
535
+ "fileRef": "DACE56951C24A14D00E6ABB0"
536
+ },
537
+ "DACE56A91C24A14D00E6ABB0": {
538
+ "path": "TestProjectTests",
539
+ "isa": "PBXGroup",
540
+ "children": [
541
+ "DACE56AA1C24A14D00E6ABB0",
542
+ "DACE56AC1C24A14D00E6ABB0"
543
+ ],
544
+ "sourceTree": "<group>"
545
+ }
546
+ },
547
+ "rootObject": "DACE568A1C24A14C00E6ABB0"
548
+ }