This class represents a custom build rule of a Target.
name
compiler_spec
file_type
file_patterns
is_editable
output_files
script
isa
initialize
initialize_defaults
uuid
project
remove_from_project
display_name
to_s
referrers
add_referrer
remove_referrer
remove_reference
==
<=>
inspect
name #=> String
String
The name of the rule.
13 attribute :name, String
compiler_spec #=> String
String
A string representing what compiler to use.
`com.apple.compilers.proxy.script`.
20 attribute :compiler_spec, String
file_type #=> String
String
The type of the files that should be processed by this rule.
`pattern.proxy`.
28 attribute :file_type, String
file_patterns #=> String
String
The pattern of the files that should be processed by
this rule. This attribute is an alternative to to
file_type
.
`*.css`.
37 attribute :file_patterns, String
is_editable #=> String
String
Whether the rule is editable.
`1`.
44 attribute :is_editable, String, '1'
output_files #=> ObjectList<PBXFileReference>
ObjectList
The file references for the output files.
49 attribute :output_files, Array
script #=> String
String
The content of the script to use for the build rule.
56 attribute :script, String
isa #=> String
String
The ISA of the class.
isa #=> String
String
The object's class name.
42 def self.isa
43 @isa ||= name.split('::').last
44 end
initialize(project, uuid) #=> AbstractObject
Project
project
The project that will host the object.
String
uuid
The UUID of the new object.
AbstractObject
A new instance of AbstractObject
64 def initialize(project, uuid)
65 @project, @uuid = project, uuid
66 @isa = self.class.isa
67 @referrers = []
68 raise "[Xcodeproj] Attempt to initialize an abstract class." unless @isa.match(/^(PBX|XC)/)
69 end
initialize_defaults #=> void
void
81 def initialize_defaults
82 simple_attributes.each { |a| a.set_default(self) }
83 end
uuid #=> String
String
The object universally unique identifier.
project #=> Project
Project
The project that owns the object.
remove_from_project #=> void
void
101 def remove_from_project
102 @project.objects_by_uuid.delete(uuid)
103 @referrers.each { |referrer| referrer.remove_reference(self) }
104 raise "[Xcodeproj] BUG: #{self} should have no referrers instead the following objects are still referencing it #{referrers}" unless referrers.count == 0
105 end
display_name #=> String
String
A name for the object.
Xcodeproj::Project::Object::AbstractObject#to_s
115 def display_name
116 declared_name = name if self.respond_to?(:name)
117 if declared_name && !declared_name.empty?
118 declared_name
119 else
120 isa.gsub(/^(PBX|XC)/, '')
121 end
122 end
to_s #=> String
String
A name for the object.
124 def display_name
125 declared_name = name if self.respond_to?(:name)
126 if declared_name && !declared_name.empty?
127 declared_name
128 else
129 isa.gsub(/^(PBX|XC)/, '')
130 end
131 end
referrers #=> Array<ObjectList>
Array
The list of the objects that have a reference to this object.
add_referrer(referrer) #=> void
void
143 def add_referrer(referrer)
144 @referrers << referrer
145 @project.objects_by_uuid[uuid] = self
146 end
remove_referrer(referrer) #=> void
void
156 def remove_referrer(referrer)
157 @referrers.delete(referrer)
158 if @referrers.count == 0
159 @project.objects_by_uuid.delete(uuid)
160 end
161 end
remove_reference(object) #=> void
void
169 def remove_reference(object)
170 to_one_attributes.each do |attrb|
171 value = attrb.get_value(self)
172 attrb.set_value(self, nil) if value.equal?(object)
173 end
174
175 to_many_attributes.each do |attrb|
176 list = attrb.get_value(self)
177 list.delete(object)
178 end
179
180 references_by_keys_attributes.each do |attrb|
181 list = attrb.get_value(self)
182 list.each { |dictionary| dictionary.remove_reference(object) }
183 end
184 end
configure_with_plist(objects_by_uuid_plist) #=> void
void
202 def configure_with_plist(objects_by_uuid_plist)
203 object_plist = objects_by_uuid_plist[uuid].dup
204
205 raise "[Xcodeproj] Attempt to initialize `#{isa}` from plist with different isa `#{object_plist}`" unless object_plist['isa'] == isa
206 object_plist.delete('isa')
207
208 simple_attributes.each do |attrb|
209 attrb.set_value(self, object_plist[attrb.plist_name])
210 object_plist.delete(attrb.plist_name)
211 end
212
213 to_one_attributes.each do |attrb|
214 ref_uuid = object_plist[attrb.plist_name]
215 if ref_uuid
216 ref = object_with_uuid(ref_uuid, objects_by_uuid_plist, attrb)
217 attrb.set_value(self, ref) if ref
218 end
219 object_plist.delete(attrb.plist_name)
220 end
221
222 to_many_attributes.each do |attrb|
223 ref_uuids = object_plist[attrb.plist_name] || []
224 list = attrb.get_value(self)
225 ref_uuids.each do |uuid|
226 ref = object_with_uuid(uuid, objects_by_uuid_plist, attrb)
227 list << ref if ref
228 end
229 object_plist.delete(attrb.plist_name)
230 end
231
232 references_by_keys_attributes.each do |attrb|
233 hashes = object_plist[attrb.plist_name] || {}
234 list = attrb.get_value(self)
235 hashes.each do |hash|
236 dictionary = ObjectDictionary.new(attrb, self)
237 hash.each do |key, uuid|
238 ref = object_with_uuid(uuid, objects_by_uuid_plist, attrb)
239 dictionary[key] = ref if ref
240 end
241 list << dictionary
242 end
243 object_plist.delete(attrb.plist_name)
244 end
245
246 unless object_plist.empty?
247 raise "[!] Xcodeproj doesn't know about the following attributes " \
248 "#{object_plist.inspect} for the '#{isa}' isa.\n" \
249 "Please file an issue: https://github.com/CocoaPods/Xcodeproj/issues/new"
250 end
251 end
object_with_uuid(uuid, objects_by_uuid_plist, attribute) #=> AbstractObject, Nil
String
uuid
The UUID of the object that should be initialized.
Hash{String=>String}
objects_by_uuid_plist
The hash contained by objects
key of the plist containing
the information about the object that should be initialized.
AbstractObjectAttribute
attribute
The attribute that requested the object. It is used only for exceptions.
AbstractObject
The initialized object.
Nil
If the UUID could not be found in the objects hash. In this case a warning is printed to STDERR.
274 def object_with_uuid(uuid, objects_by_uuid_plist, attribute)
275 unless object = project.objects_by_uuid[uuid] || project.new_from_plist(uuid, objects_by_uuid_plist)
276 UI.warn "`#{inspect}` attempted to initialize an object with " \
277 "an unknown UUID. `#{uuid}` for attribute: `#{attribute.name}`."\
278 " This can be the result of a merge and the unknown UUID is " \
279 "being discarded."
280 end
281 object
282 rescue NameError
283 attributes = objects_by_uuid_plist[uuid]
284 raise "`#{isa}` attempted to initialize an object with unknown ISA "\
285 "`#{attributes['isa']}` from attributes: `#{attributes}`\n" \
286 "Please file an issue: https://github.com/CocoaPods/Xcodeproj/issues/new"
287 end
to_hash #=> Hash
Hash
A hash representation of the project.
299 def to_hash
300 plist = {}
301 plist['isa'] = isa
302
303 simple_attributes.each do |attrb|
304 value = attrb.get_value(self)
305 plist[attrb.plist_name] = value if value
306 end
307
308 to_one_attributes.each do |attrb|
309 obj = attrb.get_value(self)
310 plist[attrb.plist_name] = obj.uuid if obj
311 end
312
313 to_many_attributes.each do |attrb|
314 list = attrb.get_value(self)
315 plist[attrb.plist_name] = list.uuids
316 end
317
318 references_by_keys_attributes.each do |attrb|
319 list = attrb.get_value(self)
320 plist[attrb.plist_name] = list.map { |dictionary| dictionary.to_hash }
321 end
322
323 plist
324 end
to_tree_hash #=> Hash
Hash
A hash representation of the project different from the plist one.
339 def to_tree_hash
340 hash = {}
341 hash['displayName'] = display_name
342 hash['isa'] = isa
343
344 simple_attributes.each do |attrb|
345 value = attrb.get_value(self)
346 hash[attrb.plist_name] = value if value
347 end
348
349 to_one_attributes.each do |attrb|
350 obj = attrb.get_value(self)
351 hash[attrb.plist_name] = obj.to_tree_hash if obj
352 end
353
354 to_many_attributes.each do |attrb|
355 list = attrb.get_value(self)
356 hash[attrb.plist_name] = list.map { |obj| obj.to_tree_hash }
357 end
358
359 references_by_keys_attributes.each do |attrb|
360 list = attrb.get_value(self)
361 hash[attrb.plist_name] = list.map { |dictionary| dictionary.to_tree_hash }
362 end
363
364 hash
365 end
pretty_print #=> Hash{String => Hash}
Hash{String => Hash}
A hash suitable to display the object to the user.
370 def pretty_print
371 if to_many_attributes.count == 1
372 children = to_many_attributes.first.get_value(self)
373 {display_name => children.map(&:pretty_print)}
374 else
375 display_name
376 end
377 end
==(other) #=> undefined
385 def ==(other)
386 other.is_a?(AbstractObject) && self.to_hash == other.to_hash
387 end
<=>(other) #=> undefined
389 def <=>(other)
390 self.uuid <=> other.uuid
391 end
inspect #=> undefined
393 def inspect
394 name_part = " name=#{self.name}" if respond_to?(:name)
395 "<#{self.class}#{name_part} UUID=#{uuid}>"
396 end