plasmo_xcodeproj 1.21.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +19 -0
  3. data/README.md +95 -0
  4. data/bin/xcodeproj +10 -0
  5. data/lib/xcodeproj/command/config_dump.rb +91 -0
  6. data/lib/xcodeproj/command/project_diff.rb +56 -0
  7. data/lib/xcodeproj/command/show.rb +60 -0
  8. data/lib/xcodeproj/command/sort.rb +44 -0
  9. data/lib/xcodeproj/command/target_diff.rb +43 -0
  10. data/lib/xcodeproj/command.rb +63 -0
  11. data/lib/xcodeproj/config/other_linker_flags_parser.rb +73 -0
  12. data/lib/xcodeproj/config.rb +386 -0
  13. data/lib/xcodeproj/constants.rb +465 -0
  14. data/lib/xcodeproj/differ.rb +239 -0
  15. data/lib/xcodeproj/gem_version.rb +5 -0
  16. data/lib/xcodeproj/helper.rb +30 -0
  17. data/lib/xcodeproj/plist.rb +94 -0
  18. data/lib/xcodeproj/project/case_converter.rb +90 -0
  19. data/lib/xcodeproj/project/object/build_configuration.rb +255 -0
  20. data/lib/xcodeproj/project/object/build_file.rb +84 -0
  21. data/lib/xcodeproj/project/object/build_phase.rb +369 -0
  22. data/lib/xcodeproj/project/object/build_rule.rb +109 -0
  23. data/lib/xcodeproj/project/object/configuration_list.rb +117 -0
  24. data/lib/xcodeproj/project/object/container_item_proxy.rb +116 -0
  25. data/lib/xcodeproj/project/object/file_reference.rb +338 -0
  26. data/lib/xcodeproj/project/object/group.rb +506 -0
  27. data/lib/xcodeproj/project/object/helpers/build_settings_array_settings_by_object_version.rb +72 -0
  28. data/lib/xcodeproj/project/object/helpers/file_references_factory.rb +245 -0
  29. data/lib/xcodeproj/project/object/helpers/groupable_helper.rb +260 -0
  30. data/lib/xcodeproj/project/object/native_target.rb +751 -0
  31. data/lib/xcodeproj/project/object/reference_proxy.rb +86 -0
  32. data/lib/xcodeproj/project/object/root_object.rb +100 -0
  33. data/lib/xcodeproj/project/object/swift_package_product_dependency.rb +29 -0
  34. data/lib/xcodeproj/project/object/swift_package_remote_reference.rb +33 -0
  35. data/lib/xcodeproj/project/object/target_dependency.rb +94 -0
  36. data/lib/xcodeproj/project/object.rb +534 -0
  37. data/lib/xcodeproj/project/object_attributes.rb +522 -0
  38. data/lib/xcodeproj/project/object_dictionary.rb +210 -0
  39. data/lib/xcodeproj/project/object_list.rb +223 -0
  40. data/lib/xcodeproj/project/project_helper.rb +341 -0
  41. data/lib/xcodeproj/project/uuid_generator.rb +132 -0
  42. data/lib/xcodeproj/project.rb +874 -0
  43. data/lib/xcodeproj/scheme/abstract_scheme_action.rb +100 -0
  44. data/lib/xcodeproj/scheme/analyze_action.rb +19 -0
  45. data/lib/xcodeproj/scheme/archive_action.rb +59 -0
  46. data/lib/xcodeproj/scheme/build_action.rb +298 -0
  47. data/lib/xcodeproj/scheme/buildable_product_runnable.rb +55 -0
  48. data/lib/xcodeproj/scheme/buildable_reference.rb +129 -0
  49. data/lib/xcodeproj/scheme/command_line_arguments.rb +162 -0
  50. data/lib/xcodeproj/scheme/environment_variables.rb +170 -0
  51. data/lib/xcodeproj/scheme/execution_action.rb +86 -0
  52. data/lib/xcodeproj/scheme/launch_action.rb +179 -0
  53. data/lib/xcodeproj/scheme/location_scenario_reference.rb +49 -0
  54. data/lib/xcodeproj/scheme/macro_expansion.rb +34 -0
  55. data/lib/xcodeproj/scheme/profile_action.rb +57 -0
  56. data/lib/xcodeproj/scheme/remote_runnable.rb +92 -0
  57. data/lib/xcodeproj/scheme/send_email_action_content.rb +84 -0
  58. data/lib/xcodeproj/scheme/shell_script_action_content.rb +77 -0
  59. data/lib/xcodeproj/scheme/test_action.rb +394 -0
  60. data/lib/xcodeproj/scheme/xml_element_wrapper.rb +82 -0
  61. data/lib/xcodeproj/scheme.rb +375 -0
  62. data/lib/xcodeproj/user_interface.rb +22 -0
  63. data/lib/xcodeproj/workspace/file_reference.rb +79 -0
  64. data/lib/xcodeproj/workspace/group_reference.rb +67 -0
  65. data/lib/xcodeproj/workspace/reference.rb +40 -0
  66. data/lib/xcodeproj/workspace.rb +277 -0
  67. data/lib/xcodeproj/xcodebuild_helper.rb +108 -0
  68. data/lib/xcodeproj.rb +29 -0
  69. metadata +208 -0
@@ -0,0 +1,534 @@
1
+ module Xcodeproj
2
+ class Project
3
+ # This is the namespace in which all the classes that wrap the objects in
4
+ # a Xcode project reside.
5
+ #
6
+ # The base class from which all classes inherit is AbstractObject.
7
+ #
8
+ # If you need to deal with these classes directly, it's possible to include
9
+ # this namespace into yours, making it unnecessary to prefix them with
10
+ # Xcodeproj::Project::Object.
11
+ #
12
+ # @example
13
+ # class SourceFileSorter
14
+ # include Xcodeproj::Project::Object
15
+ # end
16
+ #
17
+ module Object
18
+ # @abstract
19
+ #
20
+ # This is the base class of all object types that can exist in a Xcode
21
+ # project. As such it provides common behavior, but you can only use
22
+ # instances of subclasses of AbstractObject, because this class does
23
+ # not exist in actual Xcode projects.
24
+ #
25
+ # Almost all the methods implemented by this class are not expected to be
26
+ # used by {Xcodeproj} clients.
27
+ #
28
+ # Subclasses should clearly identify which methods reflect the xcodeproj
29
+ # document model and which methods are offered as convenience. Object
30
+ # lists always represent a relationship to many of the model while simple
31
+ # arrays represent dynamically generated values offered a convenience for
32
+ # clients.
33
+ #
34
+ class AbstractObject
35
+ # @!group AbstractObject
36
+
37
+ # @return [String] the ISA of the class.
38
+ #
39
+ def self.isa
40
+ @isa ||= name.split('::').last
41
+ end
42
+
43
+ # @return [String] the object's class name.
44
+ #
45
+ attr_reader :isa
46
+
47
+ # It is not recommended to instantiate objects through this
48
+ # constructor. To create objects manually is easier to use
49
+ # the {Project#new}. Otherwise, it is possible to use the convenience
50
+ # methods offered by {Xcodeproj} which take care of configuring the
51
+ # objects for common usage cases.
52
+ #
53
+ # @param [Project] project
54
+ # the project that will host the object.
55
+ #
56
+ # @param [String] uuid
57
+ # the UUID of the new object.
58
+ #
59
+ # @visibility private
60
+ #
61
+ def initialize(project, uuid)
62
+ @project = project
63
+ @uuid = uuid
64
+ @isa = self.class.isa
65
+ @referrers = []
66
+ unless @isa =~ /^(PBX|XC)/
67
+ raise "[Xcodeproj] Attempt to initialize an abstract class (#{self.class})."
68
+ end
69
+ end
70
+
71
+ # Initializes the object with the default values of simple attributes.
72
+ #
73
+ # This method is called by the {Project#new} and is not performed on
74
+ # initialization to prevent adding defaults to objects generated by a
75
+ # plist.
76
+ #
77
+ # @return [void]
78
+ #
79
+ # @visibility private
80
+ #
81
+ def initialize_defaults
82
+ simple_attributes.each { |a| a.set_default(self) }
83
+ end
84
+
85
+ # @return [String] the object universally unique identifier.
86
+ #
87
+ attr_reader :uuid
88
+
89
+ # @return [Project] the project that owns the object.
90
+ #
91
+ attr_reader :project
92
+
93
+ # Removes the object from the project by asking to its referrers to
94
+ # remove the reference to it.
95
+ #
96
+ # @note The root object is owned by the project and should not be
97
+ # manipulated with this method.
98
+ #
99
+ # @return [void]
100
+ #
101
+ def remove_from_project
102
+ mark_project_as_dirty!
103
+ project.objects_by_uuid.delete(uuid)
104
+
105
+ referrers.dup.each do |referrer|
106
+ referrer.remove_reference(self)
107
+ end
108
+
109
+ to_one_attributes.each do |attrb|
110
+ object = attrb.get_value(self)
111
+ object.remove_referrer(self) if object
112
+ end
113
+
114
+ to_many_attributes.each do |attrb|
115
+ list = attrb.get_value(self)
116
+ list.clear
117
+ end
118
+
119
+ unless referrers.count == 0
120
+ raise "[Xcodeproj] BUG: #{self} should have no referrers instead" \
121
+ "the following objects are still referencing it #{referrers}"
122
+ end
123
+ end
124
+
125
+ # Returns the value of the name attribute or returns a generic name for
126
+ # the object.
127
+ #
128
+ # @note Not all concrete classes implement the name attribute and this
129
+ # method prevents from overriding it in plist.
130
+ #
131
+ # @return [String] a name for the object.
132
+ #
133
+ def display_name
134
+ declared_name = name if self.respond_to?(:name)
135
+ if declared_name && !declared_name.empty?
136
+ declared_name
137
+ else
138
+ isa.gsub(/^(PBX|XC)/, '')
139
+ end
140
+ end
141
+ alias_method :to_s, :display_name
142
+
143
+ # Sorts the to many attributes of the object according to the display
144
+ # name.
145
+ #
146
+ def sort(_options = nil)
147
+ to_many_attributes.each do |attrb|
148
+ list = attrb.get_value(self)
149
+ list.sort! do |x, y|
150
+ x.display_name.downcase <=> y.display_name.downcase
151
+ end
152
+ end
153
+ end
154
+
155
+ # Sorts the object and the objects that it references.
156
+ #
157
+ # @param [Hash] options
158
+ # the sorting options.
159
+ # @option options [Symbol] :groups_position
160
+ # the position of the groups can be either `:above` or
161
+ # `:below`.
162
+ #
163
+ # @note Some objects may in turn refer back to objects higher in the
164
+ # object tree, which will lead to stack level deep errors.
165
+ # These objects should **not** try to perform a recursive sort,
166
+ # also because these objects would get sorted through other
167
+ # paths in the tree anyways.
168
+ #
169
+ # At the time of writing the only known case is
170
+ # `PBXTargetDependency`.
171
+ #
172
+ def sort_recursively(options = nil)
173
+ to_one_attributes.each do |attrb|
174
+ value = attrb.get_value(self)
175
+ value.sort_recursively(options) if value
176
+ end
177
+
178
+ to_many_attributes.each do |attrb|
179
+ list = attrb.get_value(self)
180
+ list.each { |entry| entry.sort_recursively(options) }
181
+ end
182
+
183
+ sort(options)
184
+ end
185
+
186
+ # @!group Reference counting
187
+
188
+ # @return [Array<ObjectList>] The list of the objects that have a
189
+ # reference to this object.
190
+ #
191
+ # @visibility private
192
+ #
193
+ attr_reader :referrers
194
+
195
+ # Informs the object that another object is referencing it. If the
196
+ # object had no previous references it is added to the project UUIDs
197
+ # hash.
198
+ #
199
+ # @return [void]
200
+ #
201
+ # @visibility private
202
+ #
203
+ def add_referrer(referrer)
204
+ @referrers << referrer
205
+ @project.objects_by_uuid[uuid] = self
206
+ end
207
+
208
+ # Informs the object that another object stopped referencing it. If the
209
+ # object has no other references it is removed from the project UUIDs
210
+ # hash because it is unreachable.
211
+ #
212
+ # @return [void]
213
+ #
214
+ # @visibility private
215
+ #
216
+ def remove_referrer(referrer)
217
+ @referrers.delete(referrer)
218
+ if @referrers.count == 0
219
+ mark_project_as_dirty!
220
+ @project.objects_by_uuid.delete(uuid)
221
+ end
222
+ end
223
+
224
+ # Removes all the references to a given object.
225
+ #
226
+ # @return [void]
227
+ #
228
+ # @visibility private
229
+ #
230
+ def remove_reference(object)
231
+ to_one_attributes.each do |attrb|
232
+ value = attrb.get_value(self)
233
+ attrb.set_value(self, nil) if value.equal?(object)
234
+ end
235
+
236
+ to_many_attributes.each do |attrb|
237
+ list = attrb.get_value(self)
238
+ list.delete(object)
239
+ end
240
+
241
+ references_by_keys_attributes.each do |attrb|
242
+ list = attrb.get_value(self)
243
+ list.each { |dictionary| dictionary.remove_reference(object) }
244
+ end
245
+ end
246
+
247
+ # Marks the project that this object belongs to as having been modified.
248
+ #
249
+ # @return [void]
250
+ #
251
+ # @visibility private
252
+ #
253
+ def mark_project_as_dirty!
254
+ project.mark_dirty!
255
+ end
256
+
257
+ #---------------------------------------------------------------------#
258
+
259
+ public
260
+
261
+ # @!group Plist related methods
262
+
263
+ # Configures the object with the objects hash from a plist.
264
+ #
265
+ # **Implementation detail**: it is important that the attributes for a
266
+ # given concrete class are unique because the value is removed from the
267
+ # array at each iteration and duplicate would result in nil values.
268
+ #
269
+ # @return [void]
270
+ #
271
+ # @visibility private
272
+ #
273
+ def configure_with_plist(objects_by_uuid_plist)
274
+ object_plist = objects_by_uuid_plist[uuid].dup
275
+
276
+ unless object_plist['isa'] == isa
277
+ raise "[Xcodeproj] Attempt to initialize `#{isa}` from plist with " \
278
+ "different isa `#{object_plist}`"
279
+ end
280
+ object_plist.delete('isa')
281
+
282
+ simple_attributes.each do |attrb|
283
+ attrb.set_value(self, object_plist[attrb.plist_name])
284
+ object_plist.delete(attrb.plist_name)
285
+ end
286
+
287
+ to_one_attributes.each do |attrb|
288
+ ref_uuid = object_plist[attrb.plist_name]
289
+ if ref_uuid
290
+ ref = object_with_uuid(ref_uuid, objects_by_uuid_plist, attrb)
291
+ attrb.set_value(self, ref) if ref
292
+ end
293
+ object_plist.delete(attrb.plist_name)
294
+ end
295
+
296
+ to_many_attributes.each do |attrb|
297
+ ref_uuids = object_plist[attrb.plist_name] || []
298
+ list = attrb.get_value(self)
299
+ ref_uuids.each do |uuid|
300
+ ref = object_with_uuid(uuid, objects_by_uuid_plist, attrb)
301
+ list << ref if ref
302
+ end
303
+ object_plist.delete(attrb.plist_name)
304
+ end
305
+
306
+ references_by_keys_attributes.each do |attrb|
307
+ hashes = object_plist[attrb.plist_name] || {}
308
+ list = attrb.get_value(self)
309
+ hashes.each do |hash|
310
+ dictionary = ObjectDictionary.new(attrb, self)
311
+ hash.each do |key, uuid|
312
+ ref = object_with_uuid(uuid, objects_by_uuid_plist, attrb)
313
+ dictionary[key] = ref if ref
314
+ end
315
+ list << dictionary
316
+ end
317
+ object_plist.delete(attrb.plist_name)
318
+ end
319
+
320
+ unless object_plist.empty?
321
+ UI.warn "[!] Xcodeproj doesn't know about the following " \
322
+ "attributes #{object_plist.inspect} for the '#{isa}' isa." \
323
+ "\nIf this attribute was generated by Xcode please file " \
324
+ 'an issue: https://github.com/CocoaPods/Xcodeproj/issues/new'
325
+ end
326
+ end
327
+
328
+ # Initializes and returns the object with the given UUID.
329
+ #
330
+ # @param [String] uuid
331
+ # The UUID of the object that should be initialized.
332
+ #
333
+ # @param [Hash{String=>String}] objects_by_uuid_plist
334
+ # The hash contained by `objects` key of the plist containing
335
+ # the information about the object that should be initialized.
336
+ #
337
+ # @param [AbstractObjectAttribute] attribute
338
+ # The attribute that requested the object. It is used only for
339
+ # exceptions.
340
+ #
341
+ # @raise If the hash for the given UUID contains an unknown ISA.
342
+ #
343
+ # @return [AbstractObject] the initialized object.
344
+ # @return [Nil] if the UUID could not be found in the objects hash. In
345
+ # this case a warning is printed to STDERR.
346
+ #
347
+ # @visibility private
348
+ #
349
+ def object_with_uuid(uuid, objects_by_uuid_plist, attribute)
350
+ unless object = project.objects_by_uuid[uuid] || project.new_from_plist(uuid, objects_by_uuid_plist)
351
+ UI.warn "`#{inspect}` attempted to initialize an object with " \
352
+ "an unknown UUID. `#{uuid}` for attribute: " \
353
+ "`#{attribute.name}`. This can be the result of a merge and " \
354
+ 'the unknown UUID is being discarded.'
355
+ end
356
+ object
357
+ rescue NameError
358
+ attributes = objects_by_uuid_plist[uuid]
359
+ raise "`#{isa}` attempted to initialize an object with unknown ISA "\
360
+ "`#{attributes['isa']}` from attributes: `#{attributes}`\n" \
361
+ 'If this ISA was generated by Xcode please file an issue: ' \
362
+ 'https://github.com/CocoaPods/Xcodeproj/issues/new'
363
+ end
364
+
365
+ # Returns a cascade representation of the object with UUIDs.
366
+ #
367
+ # @return [Hash] a hash representation of the project.
368
+ #
369
+ # @visibility public
370
+ #
371
+ # @note the key for simple and to_one attributes usually appears only
372
+ # if there is a value. To-many keys always appear with an empty
373
+ # array.
374
+ #
375
+ def to_hash
376
+ to_hash_as
377
+ end
378
+
379
+ def to_hash_as(method = :to_hash)
380
+ plist = {}
381
+ plist['isa'] = isa
382
+
383
+ simple_attributes.each do |attrb|
384
+ value = attrb.get_value(self)
385
+ plist[attrb.plist_name] = value if value
386
+ end
387
+
388
+ to_one_attributes.each do |attrb|
389
+ obj = attrb.get_value(self)
390
+ plist[attrb.plist_name] = nested_object_for_hash(obj, method) if obj
391
+ end
392
+
393
+ to_many_attributes.each do |attrb|
394
+ list = attrb.get_value(self)
395
+ plist[attrb.plist_name] = list.map { |o| nested_object_for_hash(o, method) }
396
+ end
397
+
398
+ references_by_keys_attributes.each do |attrb|
399
+ list = attrb.get_value(self)
400
+ plist[attrb.plist_name] = list.map(&method)
401
+ end
402
+
403
+ plist
404
+ end
405
+ private :to_hash_as
406
+
407
+ def nested_object_for_hash(object, method)
408
+ case method
409
+ when :to_ascii_plist
410
+ Nanaimo::String.new(object.uuid, object.ascii_plist_annotation)
411
+ else
412
+ object.uuid
413
+ end
414
+ end
415
+
416
+ def ascii_plist_annotation
417
+ " #{display_name} "
418
+ end
419
+
420
+ def to_ascii_plist
421
+ Nanaimo::Dictionary.new(to_hash_as(:to_ascii_plist), ascii_plist_annotation)
422
+ end
423
+
424
+ # Returns a cascade representation of the object without UUIDs.
425
+ #
426
+ # This method is designed to work in conjunction with
427
+ # {Hash#recursive_diff} to provide a complete, yet readable, diff of
428
+ # two projects *not* affected by ISA differences.
429
+ #
430
+ # @todo The current implementation might lead to infinite loops.
431
+ #
432
+ # @return [Hash] a hash representation of the project different from
433
+ # the plist one.
434
+ #
435
+ # @visibility private
436
+ #
437
+ def to_tree_hash
438
+ hash = {}
439
+ hash['displayName'] = display_name
440
+ hash['isa'] = isa
441
+
442
+ simple_attributes.each do |attrb|
443
+ value = attrb.get_value(self)
444
+ hash[attrb.plist_name] = value if value
445
+ end
446
+
447
+ to_one_attributes.each do |attrb|
448
+ obj = attrb.get_value(self)
449
+ hash[attrb.plist_name] = obj.to_tree_hash if obj
450
+ end
451
+
452
+ to_many_attributes.each do |attrb|
453
+ list = attrb.get_value(self)
454
+ hash[attrb.plist_name] = list.map(&:to_tree_hash)
455
+ end
456
+
457
+ references_by_keys_attributes.each do |attrb|
458
+ list = attrb.get_value(self)
459
+ hash[attrb.plist_name] = list.map(&:to_tree_hash)
460
+ end
461
+
462
+ hash
463
+ end
464
+
465
+ # @return [Hash{String => Hash}] A hash suitable to display the object
466
+ # to the user.
467
+ #
468
+ def pretty_print
469
+ if to_many_attributes.count == 1
470
+ children = to_many_attributes.first.get_value(self)
471
+ { display_name => children.map(&:pretty_print) }
472
+ else
473
+ display_name
474
+ end
475
+ end
476
+
477
+ #---------------------------------------------------------------------#
478
+
479
+ public
480
+
481
+ # @!group Object methods
482
+
483
+ def ==(other)
484
+ other.is_a?(AbstractObject) && to_hash == other.to_hash
485
+ end
486
+
487
+ def <=>(other)
488
+ uuid <=> other.uuid
489
+ end
490
+
491
+ def inspect
492
+ optional = ''
493
+ optional << " name=`#{name}`" if respond_to?(:name) && name
494
+ optional << " path=`#{path}`" if respond_to?(:path) && path
495
+ "<#{isa}#{optional} UUID=`#{uuid}`>"
496
+ end
497
+ end
498
+ end
499
+ end
500
+ end
501
+
502
+ require 'xcodeproj/project/case_converter'
503
+ require 'xcodeproj/project/object_attributes'
504
+ require 'xcodeproj/project/object_dictionary'
505
+ require 'xcodeproj/project/object_list'
506
+
507
+ # Required because some classes have cyclical references to each other.
508
+ #
509
+ # @todo I'm sure that there is a method to achieve the same result which
510
+ # doesn't present the risk of some rubist laughing at me :-)
511
+ #
512
+ Xcodeproj::Constants::KNOWN_ISAS.each do |superclass_name, isas|
513
+ superklass = Xcodeproj::Project::Object.const_get(superclass_name)
514
+ isas.each do |isa|
515
+ c = Class.new(superklass)
516
+ Xcodeproj::Project::Object.const_set(isa, c)
517
+ end
518
+ end
519
+
520
+ # Now load the concrete subclasses.
521
+ require 'xcodeproj/project/object/swift_package_remote_reference'
522
+ require 'xcodeproj/project/object/swift_package_product_dependency'
523
+ require 'xcodeproj/project/object/build_configuration'
524
+ require 'xcodeproj/project/object/build_file'
525
+ require 'xcodeproj/project/object/build_phase'
526
+ require 'xcodeproj/project/object/build_rule'
527
+ require 'xcodeproj/project/object/configuration_list'
528
+ require 'xcodeproj/project/object/container_item_proxy'
529
+ require 'xcodeproj/project/object/file_reference'
530
+ require 'xcodeproj/project/object/group'
531
+ require 'xcodeproj/project/object/native_target'
532
+ require 'xcodeproj/project/object/root_object'
533
+ require 'xcodeproj/project/object/target_dependency'
534
+ require 'xcodeproj/project/object/reference_proxy'