Allow installation of a pod with its own Swift version on multiple targets

parent 33a29513
...@@ -26,6 +26,10 @@ To install release candidates run `[sudo] gem install cocoapods --pre` ...@@ -26,6 +26,10 @@ To install release candidates run `[sudo] gem install cocoapods --pre`
##### Bug Fixes ##### Bug Fixes
* Allow installation of a pod with its own Swift version on multiple targets
[Dimitris Koutsogiorgas](https://github.com/dnkoutso)
[#7261](https://github.com/CocoaPods/CocoaPods/pull/7261)
* Quote framework names in OTHER_LDFLAGS * Quote framework names in OTHER_LDFLAGS
[Tyler Stromberg](https://github.com/AquaGeek) [Tyler Stromberg](https://github.com/AquaGeek)
[#7185](https://github.com/CocoaPods/CocoaPods/issues/7185) [#7185](https://github.com/CocoaPods/CocoaPods/issues/7185)
......
...@@ -91,6 +91,7 @@ module Pod ...@@ -91,6 +91,7 @@ module Pod
end end
swift_pod_targets = pod_targets.select(&:uses_swift?) swift_pod_targets = pod_targets.select(&:uses_swift?)
error_messages = swift_pod_targets.map do |pod_target| error_messages = swift_pod_targets.map do |pod_target|
next unless pod_target.spec_swift_version.nil?
swift_target_definitions = pod_target.target_definitions.reject { |target| target.swift_version.blank? } swift_target_definitions = pod_target.target_definitions.reject { |target| target.swift_version.blank? }
next if swift_target_definitions.empty? || swift_target_definitions.uniq(&:swift_version).count == 1 next if swift_target_definitions.empty? || swift_target_definitions.uniq(&:swift_version).count == 1
target_errors = swift_target_definitions.map(&error_message_for_target).join(', ') target_errors = swift_target_definitions.map(&error_message_for_target).join(', ')
......
...@@ -100,7 +100,13 @@ module Pod ...@@ -100,7 +100,13 @@ module Pod
# targets that include this pod target. # targets that include this pod target.
# #
def swift_version def swift_version
root_spec.swift_version || target_definitions.map(&:swift_version).compact.uniq.first spec_swift_version || target_definitions.map(&:swift_version).compact.uniq.first
end
# @return [String] the Swift version within the root spec. Might be `nil` if none is set.
#
def spec_swift_version
root_spec.swift_version
end end
# @note The deployment target for the pod target is the maximum of all # @note The deployment target for the pod target is the maximum of all
......
...@@ -225,8 +225,8 @@ module Pod ...@@ -225,8 +225,8 @@ module Pod
podfile.target_definitions['SampleProject'].stubs(:swift_version).returns('3.0') podfile.target_definitions['SampleProject'].stubs(:swift_version).returns('3.0')
podfile.target_definitions['TestRunner'].stubs(:swift_version).returns('2.3') podfile.target_definitions['TestRunner'].stubs(:swift_version).returns('2.3')
orangeframework_pod_target = stub(:name => 'OrangeFramework', :uses_swift? => true, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']]) orangeframework_pod_target = stub(:name => 'OrangeFramework', :uses_swift? => true, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']], :spec_swift_version => nil)
matryoshka_pod_target = stub(:name => 'matryoshka', :uses_swift? => false, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']]) matryoshka_pod_target = stub(:name => 'matryoshka', :uses_swift? => false, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']], :spec_swift_version => nil)
@validator = TargetValidator.new([], [orangeframework_pod_target, matryoshka_pod_target]) @validator = TargetValidator.new([], [orangeframework_pod_target, matryoshka_pod_target])
e = should.raise Informative do e = should.raise Informative do
...@@ -254,8 +254,8 @@ module Pod ...@@ -254,8 +254,8 @@ module Pod
# when the swift version is unset at the project level, but set in one target, swift_version is nil # when the swift version is unset at the project level, but set in one target, swift_version is nil
podfile.target_definitions['TestRunner'].stubs(:swift_version).returns(nil) podfile.target_definitions['TestRunner'].stubs(:swift_version).returns(nil)
orangeframework_pod_target = stub(:name => 'OrangeFramework', :uses_swift? => true, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']]) orangeframework_pod_target = stub(:name => 'OrangeFramework', :uses_swift? => true, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']], :spec_swift_version => nil)
matryoshka_pod_target = stub(:name => 'matryoshka', :uses_swift? => true, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']]) matryoshka_pod_target = stub(:name => 'matryoshka', :uses_swift? => true, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']], :spec_swift_version => nil)
@validator = TargetValidator.new([], [orangeframework_pod_target, matryoshka_pod_target]) @validator = TargetValidator.new([], [orangeframework_pod_target, matryoshka_pod_target])
lambda { @validator.validate! }.should.not.raise lambda { @validator.validate! }.should.not.raise
...@@ -278,8 +278,31 @@ module Pod ...@@ -278,8 +278,31 @@ module Pod
podfile.target_definitions['TestRunner'].stubs(:swift_version).returns('2.3') podfile.target_definitions['TestRunner'].stubs(:swift_version).returns('2.3')
# Pretend none of the pod targets use swift, even if the target definitions they are linked with do have different Swift versions. # Pretend none of the pod targets use swift, even if the target definitions they are linked with do have different Swift versions.
orangeframework_pod_target = stub(:name => 'OrangeFramework', :uses_swift? => false, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']]) orangeframework_pod_target = stub(:name => 'OrangeFramework', :uses_swift? => false, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']], :spec_swift_version => nil)
matryoshka_pod_target = stub(:name => 'matryoshka', :uses_swift? => false, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']]) matryoshka_pod_target = stub(:name => 'matryoshka', :uses_swift? => false, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']], :spec_swift_version => nil)
@validator = TargetValidator.new([], [orangeframework_pod_target, matryoshka_pod_target])
lambda { @validator.validate! }.should.not.raise
end
it 'does not raise when targets with different Swift versions integrate the same pod that specifies swift version attribute' do
fixture_path = ROOT + 'spec/fixtures'
config.repos_dir = fixture_path + 'spec-repos'
podfile = Podfile.new do
project 'SampleProject/SampleProject'
use_frameworks!
platform :ios, '8.0'
pod 'OrangeFramework', :path => (fixture_path + 'orange-framework').to_s
pod 'matryoshka', :path => (fixture_path + 'matryoshka').to_s
target 'SampleProject'
target 'TestRunner'
end
podfile.target_definitions['SampleProject'].stubs(:swift_version).returns('3.0')
podfile.target_definitions['TestRunner'].stubs(:swift_version).returns('2.3')
orangeframework_pod_target = stub(:name => 'OrangeFramework', :uses_swift? => true, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']], :spec_swift_version => '4.0')
matryoshka_pod_target = stub(:name => 'matryoshka', :uses_swift? => true, :target_definitions => [podfile.target_definitions['SampleProject'], podfile.target_definitions['TestRunner']], :spec_swift_version => '3.2')
@validator = TargetValidator.new([], [orangeframework_pod_target, matryoshka_pod_target]) @validator = TargetValidator.new([], [orangeframework_pod_target, matryoshka_pod_target])
lambda { @validator.validate! }.should.not.raise lambda { @validator.validate! }.should.not.raise
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment