lib/xcodeproj/project/object/container_item_proxy.rb
module Xcodeproj class Project module Object # Apparently a proxy for another object which might belong another # project contained in the same workspace of the project document. # # This class is referenced by {PBXTargetDependency} for information about # it usage see the specs of that class. # # @note This class references the other objects by UUID instead of # creating proper relationships because the other objects might be # part of another project. This implies that the references to # other objects should not increase the retain count of the # targets. # # @todo: This class needs some work to support targets across workspaces, # as the container portal might not be initialized leading # xcodeproj to raise because ti can't find the UUID. # class PBXContainerItemProxy < AbstractObject # @!group Attributes # @return [String] apparently the UUID of the root object # {PBXProject} of the project containing the represented # object. # # @todo this is an attribute because a it is usually a reference to # the root object or to a file reference to another project. # The reference to the root object causes a retain cycle that # could cause issues (e.g. in to_tree_hash). Usually those # objects are retained by at least another object (the # {Project} for the root object and a {PBXGroup} for the # reference to another project) and so the referenced object # should be serialized. # # If this assumption is incorrect, there could be loss of # information opening and saving an existing project. # # @todo This is the external reference that 'contains' other proxy # items. attribute :container_portal, String # @return [String] the type of the proxy. # # @note @see {Constants::PROXY_TYPE.values} for valid values. # attribute :proxy_type, String # @return [String] apparently the UUID of the represented # object. # # @note If the object is in another project the UUID would not be # present in the {Project#objects_by_uuid} hash. For this # reason this is not an `has_one` attribute. It is assumes that # if the object belongs to the project at least another object # should be retaining it. This assumption is reasonable because # this is a proxy class. # # If this assumption is incorrect, there could be loss of # information opening and saving an existing project. # attribute :remote_global_id_string, String # @return [String] apparently the name of the object represented by # the proxy. # attribute :remote_info, String # Checks whether the reference points to a remote project. # # @return [Bool] # def remote? project.root_object.uuid != container_portal end # Get the proxied object # # @return [AbstractObject] # def proxied_object container_portal_object.objects_by_uuid[remote_global_id_string] end def container_portal_object if remote? container_portal_file_ref = project.objects_by_uuid[container_portal] Project.open(container_portal_file_ref.real_path) else project end end def container_portal_annotation if remote? " #{File.basename(project.objects_by_uuid[container_portal].real_path)} " else project.root_object.ascii_plist_annotation end end def to_hash_as(method = :to_hash) hash = super if method == :to_ascii_plist hash['containerPortal'] = Nanaimo::String.new(container_portal, container_portal_annotation) end hash end def ascii_plist_annotation " #{isa} " end end end end end