plasmo_xcodeproj 1.21.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/LICENSE +19 -0
- data/README.md +95 -0
- data/bin/xcodeproj +10 -0
- data/lib/xcodeproj/command/config_dump.rb +91 -0
- data/lib/xcodeproj/command/project_diff.rb +56 -0
- data/lib/xcodeproj/command/show.rb +60 -0
- data/lib/xcodeproj/command/sort.rb +44 -0
- data/lib/xcodeproj/command/target_diff.rb +43 -0
- data/lib/xcodeproj/command.rb +63 -0
- data/lib/xcodeproj/config/other_linker_flags_parser.rb +73 -0
- data/lib/xcodeproj/config.rb +386 -0
- data/lib/xcodeproj/constants.rb +465 -0
- data/lib/xcodeproj/differ.rb +239 -0
- data/lib/xcodeproj/gem_version.rb +5 -0
- data/lib/xcodeproj/helper.rb +30 -0
- data/lib/xcodeproj/plist.rb +94 -0
- data/lib/xcodeproj/project/case_converter.rb +90 -0
- data/lib/xcodeproj/project/object/build_configuration.rb +255 -0
- data/lib/xcodeproj/project/object/build_file.rb +84 -0
- data/lib/xcodeproj/project/object/build_phase.rb +369 -0
- data/lib/xcodeproj/project/object/build_rule.rb +109 -0
- data/lib/xcodeproj/project/object/configuration_list.rb +117 -0
- data/lib/xcodeproj/project/object/container_item_proxy.rb +116 -0
- data/lib/xcodeproj/project/object/file_reference.rb +338 -0
- data/lib/xcodeproj/project/object/group.rb +506 -0
- data/lib/xcodeproj/project/object/helpers/build_settings_array_settings_by_object_version.rb +72 -0
- data/lib/xcodeproj/project/object/helpers/file_references_factory.rb +245 -0
- data/lib/xcodeproj/project/object/helpers/groupable_helper.rb +260 -0
- data/lib/xcodeproj/project/object/native_target.rb +751 -0
- data/lib/xcodeproj/project/object/reference_proxy.rb +86 -0
- data/lib/xcodeproj/project/object/root_object.rb +100 -0
- data/lib/xcodeproj/project/object/swift_package_product_dependency.rb +29 -0
- data/lib/xcodeproj/project/object/swift_package_remote_reference.rb +33 -0
- data/lib/xcodeproj/project/object/target_dependency.rb +94 -0
- data/lib/xcodeproj/project/object.rb +534 -0
- data/lib/xcodeproj/project/object_attributes.rb +522 -0
- data/lib/xcodeproj/project/object_dictionary.rb +210 -0
- data/lib/xcodeproj/project/object_list.rb +223 -0
- data/lib/xcodeproj/project/project_helper.rb +341 -0
- data/lib/xcodeproj/project/uuid_generator.rb +132 -0
- data/lib/xcodeproj/project.rb +874 -0
- data/lib/xcodeproj/scheme/abstract_scheme_action.rb +100 -0
- data/lib/xcodeproj/scheme/analyze_action.rb +19 -0
- data/lib/xcodeproj/scheme/archive_action.rb +59 -0
- data/lib/xcodeproj/scheme/build_action.rb +298 -0
- data/lib/xcodeproj/scheme/buildable_product_runnable.rb +55 -0
- data/lib/xcodeproj/scheme/buildable_reference.rb +129 -0
- data/lib/xcodeproj/scheme/command_line_arguments.rb +162 -0
- data/lib/xcodeproj/scheme/environment_variables.rb +170 -0
- data/lib/xcodeproj/scheme/execution_action.rb +86 -0
- data/lib/xcodeproj/scheme/launch_action.rb +179 -0
- data/lib/xcodeproj/scheme/location_scenario_reference.rb +49 -0
- data/lib/xcodeproj/scheme/macro_expansion.rb +34 -0
- data/lib/xcodeproj/scheme/profile_action.rb +57 -0
- data/lib/xcodeproj/scheme/remote_runnable.rb +92 -0
- data/lib/xcodeproj/scheme/send_email_action_content.rb +84 -0
- data/lib/xcodeproj/scheme/shell_script_action_content.rb +77 -0
- data/lib/xcodeproj/scheme/test_action.rb +394 -0
- data/lib/xcodeproj/scheme/xml_element_wrapper.rb +82 -0
- data/lib/xcodeproj/scheme.rb +375 -0
- data/lib/xcodeproj/user_interface.rb +22 -0
- data/lib/xcodeproj/workspace/file_reference.rb +79 -0
- data/lib/xcodeproj/workspace/group_reference.rb +67 -0
- data/lib/xcodeproj/workspace/reference.rb +40 -0
- data/lib/xcodeproj/workspace.rb +277 -0
- data/lib/xcodeproj/xcodebuild_helper.rb +108 -0
- data/lib/xcodeproj.rb +29 -0
- metadata +208 -0
@@ -0,0 +1,522 @@
|
|
1
|
+
module Xcodeproj
|
2
|
+
class Project
|
3
|
+
module Object
|
4
|
+
# This class represents an attribute of {AbstractObject} subclasses.
|
5
|
+
# Attributes are created by the {AbstractObject} DSL methods and allow to
|
6
|
+
# mirror the underlying attributes of the xcodeproj document model.
|
7
|
+
#
|
8
|
+
# Attributes provide support for runtime type checking. They also allow
|
9
|
+
# {AbstractObject} initialization and serialization to plist.
|
10
|
+
#
|
11
|
+
# @todo Add support for a list of required values so objects can be
|
12
|
+
# validated before serialization ?
|
13
|
+
#
|
14
|
+
class AbstractObjectAttribute
|
15
|
+
# @return [Symbol] the type of the attribute. It can be `:simple`,
|
16
|
+
# `:to_one`, `:to_many`.
|
17
|
+
#
|
18
|
+
attr_reader :type
|
19
|
+
|
20
|
+
# @return [Symbol] the name of the attribute.
|
21
|
+
#
|
22
|
+
attr_reader :name
|
23
|
+
|
24
|
+
# @return [Class] the class that owns the attribute.
|
25
|
+
#
|
26
|
+
attr_accessor :owner
|
27
|
+
|
28
|
+
# Creates a new attribute with the given type and name.
|
29
|
+
#
|
30
|
+
# Attributes are expected to be instantiated only by the
|
31
|
+
# {AbstractObject} DSL methods.
|
32
|
+
#
|
33
|
+
# @param [Symbol] type
|
34
|
+
# the type of the attribute.
|
35
|
+
#
|
36
|
+
# @param [Symbol] name
|
37
|
+
# the name of the attribute.
|
38
|
+
#
|
39
|
+
# @param [Class] owner
|
40
|
+
# the class that owns the attribute.
|
41
|
+
#
|
42
|
+
def initialize(type, name, owner)
|
43
|
+
@type = type
|
44
|
+
@name = name
|
45
|
+
@owner = owner
|
46
|
+
end
|
47
|
+
|
48
|
+
# @return [String] The name of the attribute in camel case.
|
49
|
+
#
|
50
|
+
# @example
|
51
|
+
# attribute.new(:simple, :project_root)
|
52
|
+
# attribute.plist_name #=> projectRoot
|
53
|
+
#
|
54
|
+
def plist_name
|
55
|
+
@plist_name ||= CaseConverter.convert_to_plist(name, :lower)
|
56
|
+
end
|
57
|
+
|
58
|
+
# @return [Array<Class>] the list of the classes accepted by the
|
59
|
+
# attribute.
|
60
|
+
#
|
61
|
+
attr_accessor :classes
|
62
|
+
|
63
|
+
# @return [{Symbol, Array<Class>}] the list of the classes accepted by
|
64
|
+
# each key for attributes which store a dictionary.
|
65
|
+
#
|
66
|
+
attr_accessor :classes_by_key
|
67
|
+
|
68
|
+
# @return [String, Array, Hash] the default value, if any, for simple
|
69
|
+
# attributes.
|
70
|
+
#
|
71
|
+
attr_accessor :default_value
|
72
|
+
|
73
|
+
# Convenience method that returns the value of this attribute for a
|
74
|
+
# given object.
|
75
|
+
#
|
76
|
+
# @param [AbstractObject] object
|
77
|
+
# the object for which the value of this attribute is requested.
|
78
|
+
#
|
79
|
+
# @return [String, Array, Hash, AbstractObject, ObjectList]
|
80
|
+
# the value.
|
81
|
+
#
|
82
|
+
def get_value(object)
|
83
|
+
object.send(name)
|
84
|
+
end
|
85
|
+
|
86
|
+
# Convenience method that sets the value of this attribute for a
|
87
|
+
# given object. It makes sense only for `:simple` or `:to_one`
|
88
|
+
# attributes.
|
89
|
+
#
|
90
|
+
# @raise It the type of this attribute is `:to_many`.
|
91
|
+
#
|
92
|
+
# @param [AbstractObject] object
|
93
|
+
# the object for which to set the value.
|
94
|
+
#
|
95
|
+
# @param [String, Hash, Array, AbstractObject] new_value
|
96
|
+
# the value to set for the attribute.
|
97
|
+
#
|
98
|
+
# @return [void]
|
99
|
+
#
|
100
|
+
def set_value(object, new_value)
|
101
|
+
if type == :to_many
|
102
|
+
raise '[Xcodeproj] Set value called for a to-many attribute'
|
103
|
+
end
|
104
|
+
object.send("#{name}=", new_value)
|
105
|
+
end
|
106
|
+
|
107
|
+
# Convenience method that sets the value of this attribute for a given
|
108
|
+
# object to the default (if any). It makes sense only for `:simple`
|
109
|
+
# attributes.
|
110
|
+
#
|
111
|
+
# @param [AbstractObject] object
|
112
|
+
# the object for which to set the default value.
|
113
|
+
#
|
114
|
+
# @note It is extremely important to duplicate the default values
|
115
|
+
# otherwise kittens cry!
|
116
|
+
#
|
117
|
+
# @return [void]
|
118
|
+
#
|
119
|
+
def set_default(object)
|
120
|
+
unless type == :simple
|
121
|
+
raise "[Xcodeproj] Set value called for a #{type} attribute"
|
122
|
+
end
|
123
|
+
set_value(object, default_value.dup) if default_value
|
124
|
+
end
|
125
|
+
|
126
|
+
# Checks that a given value is compatible with the attribute.
|
127
|
+
#
|
128
|
+
# This method powers the runtime type checking of the {AbstractObject}
|
129
|
+
# and is used its by synthesised methods.
|
130
|
+
#
|
131
|
+
# @raise If the class of the value is not compatible with the attribute.
|
132
|
+
#
|
133
|
+
# @return [void]
|
134
|
+
#
|
135
|
+
def validate_value(object)
|
136
|
+
return unless object
|
137
|
+
acceptable = classes.find { |klass| object.class == klass || object.class < klass }
|
138
|
+
if type == :simple
|
139
|
+
raise "[Xcodeproj] Type checking error: got `#{object.class}` " \
|
140
|
+
"for attribute: #{inspect}" unless acceptable
|
141
|
+
else
|
142
|
+
raise "[Xcodeproj] Type checking error: got `#{object.isa}` for " \
|
143
|
+
"attribute: #{inspect}" unless acceptable
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
# Checks that a given value is compatible with a key for attributes
|
148
|
+
# which store references by key.
|
149
|
+
#
|
150
|
+
# This method is used by the #{ObjectDictionary} class.
|
151
|
+
#
|
152
|
+
# @raise If the class of the value is not compatible with the given
|
153
|
+
# key.
|
154
|
+
#
|
155
|
+
def validate_value_for_key(object, key)
|
156
|
+
unless type == :references_by_keys
|
157
|
+
raise '[Xcodeproj] This method should be called only for ' \
|
158
|
+
'attributes of type `references_by_keys`'
|
159
|
+
end
|
160
|
+
|
161
|
+
unless classes_by_key.keys.include?(key)
|
162
|
+
raise "[Xcodeproj] unsupported key `#{key}` " \
|
163
|
+
"(accepted `#{classes_by_key.keys}`) for attribute `#{inspect}`"
|
164
|
+
end
|
165
|
+
|
166
|
+
return unless object
|
167
|
+
classes = Array(classes_by_key[key])
|
168
|
+
acceptable = classes.find { |klass| object.class == klass || object.class < klass }
|
169
|
+
unless acceptable
|
170
|
+
raise "[Xcodeproj] Type checking error: got `#{object.isa}` " \
|
171
|
+
"for key `#{key}` (which accepts `#{classes}`) of " \
|
172
|
+
"attribute: `#{inspect}`"
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
# @return [String] A string suitable for debugging the object.
|
177
|
+
#
|
178
|
+
def inspect
|
179
|
+
if type == :simple
|
180
|
+
"Attribute `#{plist_name}` (type: `#{type}`, classes: " \
|
181
|
+
"`#{classes}`, owner class: `#{owner.isa}`)"
|
182
|
+
else
|
183
|
+
"Attribute `#{plist_name}` (type: `#{type}`, classes: " \
|
184
|
+
"`#{classes.map(&:isa)}`, owner class: `#{owner.isa}`)"
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
class AbstractObject
|
190
|
+
# The {AbstractObject} DSL methods allow to specify with fidelity the
|
191
|
+
# underlying model of the xcodeproj document format. {AbstractObject}
|
192
|
+
# subclasses should specify their attributes through the following
|
193
|
+
# methods:
|
194
|
+
#
|
195
|
+
# - `{AbstractObject.attribute}`
|
196
|
+
# - `{AbstractObject.has_one}`
|
197
|
+
# - `{AbstractObject.has_many}`
|
198
|
+
#
|
199
|
+
# @note The subclasses should not interfere with the methods
|
200
|
+
# synthesised by the DSL and should only implement helpers in top
|
201
|
+
# of them.
|
202
|
+
#
|
203
|
+
# @note Attributes are typed and are validated at runtime.
|
204
|
+
#
|
205
|
+
class << self
|
206
|
+
# @return [Array<AbstractObjectAttribute>] the attributes associated
|
207
|
+
# with the class.
|
208
|
+
#
|
209
|
+
# @note It includes the attributes defined in the superclass and the
|
210
|
+
# list is cleaned for duplicates. Subclasses should not duplicate
|
211
|
+
# an attribute of the superclass but for the method implementation
|
212
|
+
# they will duplicate them.
|
213
|
+
#
|
214
|
+
# @visibility private
|
215
|
+
#
|
216
|
+
def attributes
|
217
|
+
unless @full_attributes
|
218
|
+
attributes = @attributes || []
|
219
|
+
if superclass.respond_to?(:attributes)
|
220
|
+
super_attributes = superclass.attributes
|
221
|
+
else
|
222
|
+
super_attributes = []
|
223
|
+
end
|
224
|
+
# The uniqueness of the attributes is very important because the
|
225
|
+
# initialization from plist deletes the values from the
|
226
|
+
# dictionary.
|
227
|
+
@full_attributes = attributes.concat(super_attributes).uniq
|
228
|
+
end
|
229
|
+
@full_attributes
|
230
|
+
end
|
231
|
+
|
232
|
+
# @return [Array<AbstractObjectAttribute>] the simple attributes
|
233
|
+
# associated with with the class.
|
234
|
+
#
|
235
|
+
# @visibility private
|
236
|
+
#
|
237
|
+
def simple_attributes
|
238
|
+
@simple_attributes ||= attributes.select { |a| a.type == :simple }
|
239
|
+
end
|
240
|
+
|
241
|
+
# @return [Array<AbstractObjectAttribute>] the attributes
|
242
|
+
# representing a to one relationship associated with with the
|
243
|
+
# class.
|
244
|
+
#
|
245
|
+
# @visibility private
|
246
|
+
#
|
247
|
+
def to_one_attributes
|
248
|
+
@to_one_attributes ||= attributes.select { |a| a.type == :to_one }
|
249
|
+
end
|
250
|
+
|
251
|
+
# @return [Array<AbstractObjectAttribute>] the attributes
|
252
|
+
# representing a to many relationship associated with with the
|
253
|
+
# class.
|
254
|
+
#
|
255
|
+
# @visibility private
|
256
|
+
#
|
257
|
+
def to_many_attributes
|
258
|
+
@to_many_attributes ||= attributes.select { |a| a.type == :to_many }
|
259
|
+
end
|
260
|
+
|
261
|
+
# @visibility private
|
262
|
+
#
|
263
|
+
def references_by_keys_attributes
|
264
|
+
@references_by_keys_attributes ||= attributes.select { |a| a.type == :references_by_keys }
|
265
|
+
end
|
266
|
+
|
267
|
+
private
|
268
|
+
|
269
|
+
# Defines a new simple attribute and synthesises the corresponding
|
270
|
+
# methods.
|
271
|
+
#
|
272
|
+
# @note Simple attributes are directly stored in a hash. They can
|
273
|
+
# contain only a string, array of strings or a hash containing
|
274
|
+
# strings and thus they are not affected by reference counting.
|
275
|
+
# Clients can access the hash directly through the
|
276
|
+
# {AbstractObject#simple_attributes_hash} method.
|
277
|
+
#
|
278
|
+
# @param [Symbol] name
|
279
|
+
# the name of the attribute.
|
280
|
+
#
|
281
|
+
# @param [Class] klass
|
282
|
+
# the accepted {Class} for the values of the attribute.
|
283
|
+
#
|
284
|
+
# @param [String, Array<String>, Hash{String=>String}] default_value
|
285
|
+
# the default value for new objects.
|
286
|
+
#
|
287
|
+
# @example
|
288
|
+
# attribute :project_root
|
289
|
+
# #=> leads to the creation of the following methods
|
290
|
+
#
|
291
|
+
# def project_root
|
292
|
+
# @simple_attributes_hash[projectRoot]
|
293
|
+
# end
|
294
|
+
#
|
295
|
+
# def project_root=(value)
|
296
|
+
# attribute.validate_value(value)
|
297
|
+
# @simple_attributes_hash[projectRoot] = value
|
298
|
+
# end
|
299
|
+
#
|
300
|
+
# @macro [attach] attribute
|
301
|
+
# @!attribute [rw] $1
|
302
|
+
#
|
303
|
+
def attribute(name, klass, default_value = nil)
|
304
|
+
attrb = AbstractObjectAttribute.new(:simple, name, self)
|
305
|
+
attrb.classes = [klass]
|
306
|
+
attrb.default_value = default_value
|
307
|
+
add_attribute(attrb)
|
308
|
+
|
309
|
+
define_method(attrb.name) do
|
310
|
+
@simple_attributes_hash ||= {}
|
311
|
+
@simple_attributes_hash[attrb.plist_name]
|
312
|
+
end
|
313
|
+
|
314
|
+
define_method("#{attrb.name}=") do |value|
|
315
|
+
@simple_attributes_hash ||= {}
|
316
|
+
attrb.validate_value(value)
|
317
|
+
|
318
|
+
existing = @simple_attributes_hash[attrb.plist_name]
|
319
|
+
if existing.is_a?(Hash) && value.is_a?(Hash)
|
320
|
+
return value if existing.keys == value.keys && existing == value
|
321
|
+
elsif existing == value
|
322
|
+
return value
|
323
|
+
end
|
324
|
+
mark_project_as_dirty!
|
325
|
+
@simple_attributes_hash[attrb.plist_name] = value
|
326
|
+
end
|
327
|
+
end
|
328
|
+
|
329
|
+
# rubocop:disable Style/PredicateName
|
330
|
+
|
331
|
+
# Defines a new relationship to a single and synthesises the
|
332
|
+
# corresponding methods.
|
333
|
+
#
|
334
|
+
# @note The synthesised setter takes care of handling reference
|
335
|
+
# counting directly.
|
336
|
+
#
|
337
|
+
# @param [String] singular_name
|
338
|
+
# the name of the relationship.
|
339
|
+
#
|
340
|
+
# @param [Class, Array<Class>] isas
|
341
|
+
# the list of the classes corresponding to the accepted isas for
|
342
|
+
# this relationship.
|
343
|
+
#
|
344
|
+
# @macro [attach] has_one
|
345
|
+
# @!attribute [rw] $1
|
346
|
+
#
|
347
|
+
def has_one(singular_name, isas)
|
348
|
+
isas = [isas] unless isas.is_a?(Array)
|
349
|
+
attrb = AbstractObjectAttribute.new(:to_one, singular_name, self)
|
350
|
+
attrb.classes = isas
|
351
|
+
add_attribute(attrb)
|
352
|
+
|
353
|
+
attr_reader(attrb.name)
|
354
|
+
# 1.9.2 fix, see https://github.com/CocoaPods/Xcodeproj/issues/40.
|
355
|
+
public(attrb.name)
|
356
|
+
|
357
|
+
variable_name = :"@#{attrb.name}"
|
358
|
+
define_method("#{attrb.name}=") do |value|
|
359
|
+
attrb.validate_value(value)
|
360
|
+
|
361
|
+
previous_value = send(attrb.name)
|
362
|
+
return value if previous_value == value
|
363
|
+
mark_project_as_dirty!
|
364
|
+
previous_value.remove_referrer(self) if previous_value
|
365
|
+
instance_variable_set(variable_name, value)
|
366
|
+
value.add_referrer(self) if value
|
367
|
+
end
|
368
|
+
end
|
369
|
+
|
370
|
+
# Defines a new ordered relationship to many.
|
371
|
+
#
|
372
|
+
# @note This attribute only generates the reader method. Clients are
|
373
|
+
# not supposed to create {ObjectList} objects which are created
|
374
|
+
# by the methods synthesised by this attribute on demand.
|
375
|
+
# Clients, however can mutate the list according to its
|
376
|
+
# interface. The list is responsible to manage the reference
|
377
|
+
# counting for its values.
|
378
|
+
#
|
379
|
+
# @param [String] plural_name
|
380
|
+
# the name of the relationship.
|
381
|
+
#
|
382
|
+
# @param [Class, Array<Class>] isas
|
383
|
+
# the list of the classes corresponding to the accepted isas for
|
384
|
+
# this relationship.
|
385
|
+
#
|
386
|
+
# @macro [attach] has_many
|
387
|
+
# @!attribute [r] $1
|
388
|
+
#
|
389
|
+
def has_many(plural_name, isas)
|
390
|
+
isas = [isas] unless isas.is_a?(Array)
|
391
|
+
|
392
|
+
attrb = AbstractObjectAttribute.new(:to_many, plural_name, self)
|
393
|
+
attrb.classes = isas
|
394
|
+
add_attribute(attrb)
|
395
|
+
|
396
|
+
variable_name = :"@#{attrb.name}"
|
397
|
+
define_method(attrb.name) do
|
398
|
+
# Here we are in the context of the instance
|
399
|
+
list = instance_variable_get(variable_name)
|
400
|
+
unless list
|
401
|
+
list = ObjectList.new(attrb, self)
|
402
|
+
instance_variable_set(variable_name, list)
|
403
|
+
end
|
404
|
+
list
|
405
|
+
end
|
406
|
+
end
|
407
|
+
|
408
|
+
# Defines a new ordered relationship to many.
|
409
|
+
#
|
410
|
+
# @note This attribute only generates the reader method. Clients are
|
411
|
+
# not supposed to create {ObjectList} objects which are created
|
412
|
+
# by the methods synthesised by this attribute on demand.
|
413
|
+
# Clients, however can mutate the list according to its
|
414
|
+
# interface. The list is responsible to manage the reference
|
415
|
+
# counting for its values.
|
416
|
+
#
|
417
|
+
# @param [String] plural_name
|
418
|
+
# the name of the relationship.
|
419
|
+
#
|
420
|
+
# @param [{Symbol, Array<Class>}] classes_by_key
|
421
|
+
# the list of the classes corresponding to the accepted isas for
|
422
|
+
# this relationship.
|
423
|
+
#
|
424
|
+
# @macro [attach] has_many
|
425
|
+
# @!attribute [r] $1
|
426
|
+
#
|
427
|
+
def has_many_references_by_keys(plural_name, classes_by_key)
|
428
|
+
attrb = AbstractObjectAttribute.new(:references_by_keys, plural_name, self)
|
429
|
+
attrb.classes = classes_by_key.values
|
430
|
+
attrb.classes_by_key = classes_by_key
|
431
|
+
add_attribute(attrb)
|
432
|
+
|
433
|
+
variable_name = :"@#{attrb.name}"
|
434
|
+
define_method(attrb.name) do
|
435
|
+
# Here we are in the context of the instance
|
436
|
+
list = instance_variable_get(variable_name)
|
437
|
+
unless list
|
438
|
+
list = ObjectList.new(attrb, self)
|
439
|
+
instance_variable_set(variable_name, list)
|
440
|
+
end
|
441
|
+
list
|
442
|
+
end
|
443
|
+
end
|
444
|
+
|
445
|
+
# rubocop:enable Style/PredicateName
|
446
|
+
|
447
|
+
protected
|
448
|
+
|
449
|
+
# Adds an attribute to the list of attributes of the class.
|
450
|
+
#
|
451
|
+
# @note This method is intended to be invoked only by the
|
452
|
+
# {AbstractObject} meta programming methods
|
453
|
+
#
|
454
|
+
# @return [void]
|
455
|
+
#
|
456
|
+
def add_attribute(attribute)
|
457
|
+
unless attribute.classes
|
458
|
+
raise "[Xcodeproj] BUG - missing classes for #{attribute.inspect}"
|
459
|
+
end
|
460
|
+
|
461
|
+
unless attribute.classes.all? { |klass| klass.is_a?(Class) }
|
462
|
+
raise "[Xcodeproj] BUG - classes:#{attribute.classes} for #{attribute.inspect}"
|
463
|
+
end
|
464
|
+
|
465
|
+
@attributes ||= []
|
466
|
+
@attributes << attribute
|
467
|
+
end
|
468
|
+
end # AbstractObject << self
|
469
|
+
|
470
|
+
private
|
471
|
+
|
472
|
+
# @return [Hash] the simple attributes hash.
|
473
|
+
#
|
474
|
+
attr_reader :simple_attributes_hash
|
475
|
+
|
476
|
+
public
|
477
|
+
|
478
|
+
# @!group xcodeproj format attributes
|
479
|
+
|
480
|
+
# @return (see AbstractObject.attributes)
|
481
|
+
#
|
482
|
+
# @visibility private
|
483
|
+
#
|
484
|
+
def attributes
|
485
|
+
self.class.attributes
|
486
|
+
end
|
487
|
+
|
488
|
+
# @return (see AbstractObject.simple_attributes)
|
489
|
+
#
|
490
|
+
# @visibility private
|
491
|
+
#
|
492
|
+
def simple_attributes
|
493
|
+
self.class.simple_attributes
|
494
|
+
end
|
495
|
+
|
496
|
+
# @return (see AbstractObject.to_one_attributes)
|
497
|
+
#
|
498
|
+
# @visibility private
|
499
|
+
#
|
500
|
+
def to_one_attributes
|
501
|
+
self.class.to_one_attributes
|
502
|
+
end
|
503
|
+
|
504
|
+
# @return (see AbstractObject.to_many_attributes)
|
505
|
+
#
|
506
|
+
# @visibility private
|
507
|
+
#
|
508
|
+
def to_many_attributes
|
509
|
+
self.class.to_many_attributes
|
510
|
+
end
|
511
|
+
|
512
|
+
# @return (see AbstractObject.to_many_attributes)
|
513
|
+
#
|
514
|
+
# @visibility private
|
515
|
+
#
|
516
|
+
def references_by_keys_attributes
|
517
|
+
self.class.references_by_keys_attributes
|
518
|
+
end
|
519
|
+
end
|
520
|
+
end
|
521
|
+
end
|
522
|
+
end
|