From c3980e09eb4f5c96c81557ec851f864c9a7ff769 Mon Sep 17 00:00:00 2001 From: Ben Asher Date: Sun, 17 Jul 2016 10:23:42 -0700 Subject: [PATCH 1/3] Support for identifying hosts of embedded targets from sub-projects --- lib/xcodeproj/project.rb | 2 +- .../project/object/target_dependency.rb | 10 +++++++++ spec/project_spec.rb | 21 +++++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/lib/xcodeproj/project.rb b/lib/xcodeproj/project.rb index 9f2e9dcaf..54f4e4184 100644 --- a/lib/xcodeproj/project.rb +++ b/lib/xcodeproj/project.rb @@ -556,7 +556,7 @@ def embedded_targets_in_native_target(native_target) def host_targets_for_embedded_target(embedded_target) native_targets.select do |native_target| ((embedded_target.uuid != native_target.uuid) && - (native_target.dependencies.map(&:target).map(&:uuid).include? embedded_target.uuid)) + (native_target.dependencies.map(&:native_target_uuid).include? embedded_target.uuid)) end end diff --git a/lib/xcodeproj/project/object/target_dependency.rb b/lib/xcodeproj/project/object/target_dependency.rb index d2a984ac3..9f658066e 100644 --- a/lib/xcodeproj/project/object/target_dependency.rb +++ b/lib/xcodeproj/project/object/target_dependency.rb @@ -39,6 +39,16 @@ def display_name return target_proxy.remote_info if target_proxy end + # @return [String] uuid of the target, if the dependency + # is a native target, otherwise the uuid of the + # target in the sub-project if the dependency is + # a target proxy + # + def native_target_uuid + return target.uuid if target + return target_proxy.remote_global_id_string if target_proxy + end + # @note This override is necessary because Xcode allows for circular # target dependencies. # diff --git a/spec/project_spec.rb b/spec/project_spec.rb index 7fe2be7d9..0b9f47f19 100644 --- a/spec/project_spec.rb +++ b/spec/project_spec.rb @@ -640,6 +640,27 @@ def target_for_target_name(name) end end + describe 'Remote embedded target relationships' do + before do + dir = Pathname(fixture_path('Sample Project')) + project_path = dir + 'ContainsSubproject/ContainsSubproject.xcodeproj' + subproject_path = dir + 'ReferencedProject/ReferencedProject.xcodeproj' + @project = Xcodeproj::Project.open(project_path) + @subproject = Xcodeproj::Project.open(subproject_path) + end + + def subproject_target_for_target_name(name) + @subproject.native_targets.find do |target| + target.name == name + end + end + + it 'identifies host of target from a sub-project' do + subproject_target = subproject_target_for_target_name('ReferencedProject') + @project.host_targets_for_embedded_target(subproject_target).map(&:name).should == ['ContainsSubproject'] + end + end + #-------------------------------------------------------------------------# end end From cbacdee9ccbac6f138f74c8c386ca0e86dd9b352 Mon Sep 17 00:00:00 2001 From: Ben Asher Date: Sun, 17 Jul 2016 10:33:09 -0700 Subject: [PATCH 2/3] changelog entry --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8997671c9..2c9eefad0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,10 @@ ##### Enhancements -* None. +* Add support for identify the host of an embedded target, + when the embedded target belongs to a sub-project + [Ben Asher](https://github.com/benasher44) + [#396](https://github.com/CocoaPods/Xcodeproj/pull/396) ##### Bug Fixes From 346a751bee9f0ebd223bb80458c3c4d55c4c7f84 Mon Sep 17 00:00:00 2001 From: Ben Asher Date: Mon, 18 Jul 2016 06:50:44 -0700 Subject: [PATCH 3/3] more specs. raise if target and target_proxy are nil --- .../project/object/target_dependency.rb | 1 + spec/project/object/target_dependency_spec.rb | 31 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/lib/xcodeproj/project/object/target_dependency.rb b/lib/xcodeproj/project/object/target_dependency.rb index 9f658066e..e1e133e58 100644 --- a/lib/xcodeproj/project/object/target_dependency.rb +++ b/lib/xcodeproj/project/object/target_dependency.rb @@ -47,6 +47,7 @@ def display_name def native_target_uuid return target.uuid if target return target_proxy.remote_global_id_string if target_proxy + raise 'Expected target or target_proxy, from which to fetch a uuid' end # @note This override is necessary because Xcode allows for circular diff --git a/spec/project/object/target_dependency_spec.rb b/spec/project/object/target_dependency_spec.rb index 0d980d78f..18850a08f 100644 --- a/spec/project/object/target_dependency_spec.rb +++ b/spec/project/object/target_dependency_spec.rb @@ -62,5 +62,36 @@ module ProjectSpecs end #----------------------------------------# + + describe '#native_target_uuid' do + it "returns the target_proxy's remote_global_uuid_string" do + target = @project.new_target(:static, 'Pods', :ios) + + proxy = @project.new(PBXContainerItemProxy) + proxy.container_portal = @project.root_object.uuid + proxy.remote_info = 'Pods' + proxy.proxy_type = '1' + proxy.remote_global_id_string = target.uuid + + @target_dependency.target_proxy = proxy + @target_dependency.target_proxy.remote_global_id_string.nil?.should == false + @target_dependency.native_target_uuid.should == @target_dependency.target_proxy.remote_global_id_string + end + + it "returns the target's uuid" do + target = @project.new_target(:static, 'Pods', :ios) + @target_dependency.target = target + @target_dependency.target.uuid.nil?.should == false + @target_dependency.native_target_uuid.should == @target_dependency.target.uuid + end + + it "raises if target and target_proxy aren't set" do + @target_dependency.target.nil?.should == true + @target_dependency.target_proxy.nil?.should == true + should.raise do + @target_dependency.native_target_uuid + end.message.should.match /Expected target or target_proxy, from which to fetch a uuid/ + end + end end end