Integrate `swift_version` DSL support into pod targets
diff --git a/CHANGELOG.md b/CHANGELOG.md index dbe1d10..269d361 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md
@@ -8,6 +8,10 @@ ##### Enhancements +* Integrate `swift_version` DSL support into pod targets. + [Dimitris Koutsogiorgas](https://github.com/dnkoutso) + [#7134](https://github.com/CocoaPods/CocoaPods/issues/7134) + * Add color indication to output of `pod outdated` [iv-mexx](https://github.com/iv-mexx) [#7204](https://github.com/CocoaPods/CocoaPods/pull/7204)
diff --git a/Gemfile b/Gemfile index a91ebb2..4e774f9 100644 --- a/Gemfile +++ b/Gemfile
@@ -25,7 +25,7 @@ group :development do cp_gem 'claide', 'CLAide' - cp_gem 'cocoapods-core', 'Core' + cp_gem 'cocoapods-core', 'cocoapods-core-mine', path: '../cocoapods-core-mine' cp_gem 'cocoapods-deintegrate', 'cocoapods-deintegrate' cp_gem 'cocoapods-downloader', 'cocoapods-downloader' cp_gem 'cocoapods-plugins', 'cocoapods-plugins'
diff --git a/Gemfile.lock b/Gemfile.lock index 1e95d5d2..71359cb 100644 --- a/Gemfile.lock +++ b/Gemfile.lock
@@ -6,16 +6,6 @@ claide (1.0.2) GIT - remote: https://github.com/CocoaPods/Core.git - revision: 8cf88a076d916cf80821744a59ca1c431ccc046f - branch: master - specs: - cocoapods-core (1.4.0.beta.2) - activesupport (>= 4.0.2, < 6) - fuzzy_match (~> 2.0.4) - nap (~> 1.0) - -GIT remote: https://github.com/CocoaPods/Molinillo.git revision: beb24a0789aa67f9adef47991d3f19f72f62c4a8 branch: master @@ -100,6 +90,14 @@ json (1.7.7) PATH + remote: ../cocoapods-core-mine + specs: + cocoapods-core (1.4.0.beta.2) + activesupport (>= 4.0.2, < 6) + fuzzy_match (~> 2.0.4) + nap (~> 1.0) + +PATH remote: . specs: cocoapods (1.4.0.beta.2)
diff --git a/lib/cocoapods/target/pod_target.rb b/lib/cocoapods/target/pod_target.rb index 3df5578..bffbca5 100644 --- a/lib/cocoapods/target/pod_target.rb +++ b/lib/cocoapods/target/pod_target.rb
@@ -95,10 +95,12 @@ end end - # @return [String] the Swift version for the target. + # @return [String] the Swift version for the target. If the pod author has provided a swift version + # then that is the one returned, otherwise the Swift version is determined by the user + # targets that include this pod target. # def swift_version - target_definitions.map(&:swift_version).compact.uniq.first + root_spec.swift_version || target_definitions.map(&:swift_version).compact.uniq.first end # @note The deployment target for the pod target is the maximum of all
diff --git a/lib/cocoapods/validator.rb b/lib/cocoapods/validator.rb index acb37d9..2a13f44 100644 --- a/lib/cocoapods/validator.rb +++ b/lib/cocoapods/validator.rb
@@ -395,19 +395,39 @@ # Performs validation for which version of Swift is used during validation. # + # + # # The user will be warned that the default version of Swift was used if the following things are true: # - The project uses Swift at all # - The user did not supply a Swift version via a parameter + # - There is no `swift_version` attribute set within the specification # - There is no `.swift-version` file present either. # def validate_swift_version - if uses_swift? && @swift_version.nil? && dot_swift_version.nil? - warning(:swift_version, - 'The validator used ' \ - "Swift #{DEFAULT_SWIFT_VERSION} by default because no Swift version was specified. " \ - 'If you want to use a different version of Swift during validation, then either use the `--swift-version` parameter ' \ - 'or use a `.swift-version` file to set the version of Swift to use for ' \ - 'your Pod. For example to use Swift 4.0, run: `echo "4.0" > .swift-version`.') + return unless uses_swift? + spec_swift_version = spec.swift_version + unless spec_swift_version.nil? + message = nil + if !dot_swift_version.nil? && dot_swift_version != spec_swift_version + message = "Specification `#{spec.name}` specifies an inconsistent `swift_version` (`#{spec_swift_version}`) compared to the one present in your `.swift-version` file (`#{dot_swift_version}`). " \ + 'Please update your `.swift-version` file or remove it and replace with the `swift_version` attribute within your podspec.' + elsif !@swift_version.nil? && @swift_version != spec_swift_version + message = "Specification `#{spec.name}` specifies an inconsistent `swift_version` (`#{spec_swift_version}`) compared to the one passed during lint (`#{@swift_version}`)." + end + unless message.nil? + error('swift', message) + return + end + end + if spec_swift_version.nil? && @swift_version.nil? && dot_swift_version.nil? + warning('swift', + 'The validator used ' \ + "Swift #{DEFAULT_SWIFT_VERSION} by default because no Swift version was specified. " \ + 'If you want to use a different version of Swift during validation, then either specify a `swift_version` attribute in your podspec, ' \ + 'use the `--swift-version` parameter during lint ' \ + 'or use a `.swift-version` file to set the version of Swift to use for ' \ + 'your Pod. For example to use Swift 4.0, run: `echo "4.0" > .swift-version`.') + end end
diff --git a/spec/unit/target/pod_target_spec.rb b/spec/unit/target/pod_target_spec.rb index 531e2ce..dd4ec2f 100644 --- a/spec/unit/target/pod_target_spec.rb +++ b/spec/unit/target/pod_target_spec.rb
@@ -144,6 +144,20 @@ end end + describe 'swift version' do + it 'uses the swift version defined by the specification if one is specified in the spec' do + @pod_target.root_spec.stubs(:swift_version).returns('3.0') + @target_definition.stubs(:swift_version).returns('2.3') + @pod_target.swift_version.should == '3.0' + end + + it 'uses the swift version defined by the target definitions if no swift version is specifed in the spec' do + @pod_target.root_spec.stubs(:swift_version).returns(nil) + @target_definition.stubs(:swift_version).returns('2.3') + @pod_target.swift_version.should == '2.3' + end + end + describe 'Support files' do it 'returns the absolute path of the xcconfig file' do @pod_target.xcconfig_path('Release').to_s.should.include?(
diff --git a/spec/unit/validator_spec.rb b/spec/unit/validator_spec.rb index 8c73b90..77cefc8 100644 --- a/spec/unit/validator_spec.rb +++ b/spec/unit/validator_spec.rb
@@ -887,11 +887,59 @@ result.type.should == :warning result.message.should == 'The validator used ' \ 'Swift 3.2 by default because no Swift version was specified. ' \ - 'If you want to use a different version of Swift during validation, then either use the `--swift-version` parameter ' \ + 'If you want to use a different version of Swift during validation, then either specify a `swift_version` attribute in your podspec, ' \ + 'use the `--swift-version` parameter during lint ' \ 'or use a `.swift-version` file to set the version of Swift to use for ' \ 'your Pod. For example to use Swift 4.0, run: `echo "4.0" > .swift-version`.' end + it 'errors when swift version spec attribute does not match dot swift version' do + Specification.any_instance.stubs(:deployment_target).returns('9.0') + Specification.any_instance.stubs(:swift_version).returns('4.0') + + validator = test_swiftpod_with_dot_swift_version('3.2') + validator.validate + validator.results.count.should == 1 + + result = validator.results.first + result.type.should == :error + result.message.should == 'Specification `JSONKit` specifies an inconsistent `swift_version` (`4.0`) compared to the one present in your `.swift-version` file (`3.2`). ' \ + 'Please update your `.swift-version` file or remove it and replace with the `swift_version` attribute within your podspec.' + end + + it 'does not error when swift version spec attribute matches dot swift version' do + Specification.any_instance.stubs(:deployment_target).returns('9.0') + Specification.any_instance.stubs(:swift_version).returns('4.0') + + validator = test_swiftpod_with_dot_swift_version('4.0') + validator.validate + validator.results.count.should == 0 + end + + it 'errors when swift version spec attribute does not match parameter based swift version' do + Specification.any_instance.stubs(:deployment_target).returns('9.0') + Specification.any_instance.stubs(:swift_version).returns('4.0') + + validator = test_swiftpod + validator.swift_version = '3.2' + validator.validate + validator.results.count.should == 1 + + result = validator.results.first + result.type.should == :error + result.message.should == 'Specification `JSONKit` specifies an inconsistent `swift_version` (`4.0`) compared to the one passed during lint (`3.2`).' + end + + it 'does not error when swift version spec attribute matches parameter based swift version' do + Specification.any_instance.stubs(:deployment_target).returns('9.0') + Specification.any_instance.stubs(:swift_version).returns('4.0') + + validator = test_swiftpod + validator.swift_version = '4.0' + validator.validate + validator.results.count.should == 0 + end + it 'does not warn for Swift if version was set by a dot swift version file' do Specification.any_instance.stubs(:deployment_target).returns('9.0')