Class: Pod::DyValidator
- Inherits:
-
Object
- Object
- Pod::DyValidator
- Includes:
- Config::Mixin
- Defined in:
- lib/validator.rb
Overview
Validates a Specification.
Extends the Linter from the Core to add additional which require the LocalPod and the Installer.
In detail it checks that the file patterns defined by the user match actually do match at least a file and that the Pod builds, by installing it without integration and building the project with xcodebuild.
Defined Under Namespace
Classes: Result
Constant Summary collapse
- DEFAULT_SWIFT_VERSION =
The default version of Swift to use when linting pods
'3.2'.freeze
Instance Attribute Summary collapse
-
#allow_warnings ⇒ Bool
Whether the validator should fail on warnings, or only on errors.
-
#fail_fast ⇒ Bool
Whether the linter should fail as soon as the first build variant causes an error.
-
#file_accessor ⇒ Sandbox::FileAccessor
The file accessor for the spec.
-
#ignore_public_only_results ⇒ Boolean
Whether attributes that affect only public sources Bool be skipped.
-
#linter ⇒ Specification::Linter
readonly
The linter instance from CocoaPods Core.
-
#local ⇒ Bool
(also: #local?)
Whether the validation should be performed against the root of the podspec instead to its original source.
-
#no_clean ⇒ Bool
Whether the linter should not clean up temporary files for inspection.
-
#no_subspecs ⇒ Bool
Whether the validator should validate all subspecs.
-
#only_subspec ⇒ String
Name of the subspec to check, if nil all subspecs are checked.
-
#quick ⇒ Bool
Whether the validation should skip the checks that requires the download of the library.
-
#results ⇒ Object
readonly
Returns the value of attribute results.
-
#skip_import_validation ⇒ Object
(also: #skip_import_validation?)
Returns the value of attribute skip_import_validation.
-
#skip_tests ⇒ Bool
Whether the validator should skip building and running tests.
-
#swift_version ⇒ String
The SWIFT_VERSION to use for validation.
-
#use_frameworks ⇒ Bool
Whether frameworks should be used for the installation.
Instance Method Summary collapse
-
#dot_swift_version ⇒ String
The SWIFT_VERSION in the .swift-version file or nil.
- #failure_reason ⇒ Object
-
#file ⇒ Pathname
The path of the ‘podspec` file where #spec is defined.
-
#initialize(spec_or_path, source_urls) ⇒ DyValidator
constructor
Initialize a new instance.
-
#print_results ⇒ void
Prints the result of the validation to the user.
-
#result_color ⇒ Symbol
The color, which should been used to display the result.
-
#result_type ⇒ Symbol
The type, which should been used to display the result.
- #results_message ⇒ Object
-
#spec ⇒ Specification
The specification to lint.
-
#uses_swift? ⇒ Boolean
Whether any of the pod targets part of this validator use Swift or not.
- #validate ⇒ Bool
- #validated? ⇒ Boolean
-
#validation_dir ⇒ Pathname
The temporary directory used by the linter.
Constructor Details
#initialize(spec_or_path, source_urls) ⇒ DyValidator
Initialize a new instance
34 35 36 37 38 39 40 41 |
# File 'lib/validator.rb', line 34 def initialize(spec_or_path, source_urls) @linter = Specification::Linter.new(spec_or_path) @source_urls = if @linter.spec && @linter.spec.dependencies.empty? && @linter.spec.recursive_subspecs.all? { |s| s.dependencies.empty? } [] else source_urls.map { |url| config.sources_manager.source_with_name_or_url(url) }.map(&:url) end end |
Instance Attribute Details
#allow_warnings ⇒ Bool
Returns Whether the validator should fail on warnings, or only on errors.
187 188 189 |
# File 'lib/validator.rb', line 187 def allow_warnings @allow_warnings end |
#fail_fast ⇒ Bool
Returns whether the linter should fail as soon as the first build variant causes an error. Helpful for i.e. multi-platforms specs, specs with subspecs.
175 176 177 |
# File 'lib/validator.rb', line 175 def fail_fast @fail_fast end |
#file_accessor ⇒ Sandbox::FileAccessor
Returns the file accessor for the spec.
60 61 62 |
# File 'lib/validator.rb', line 60 def file_accessor @file_accessor end |
#ignore_public_only_results ⇒ Boolean
Returns Whether attributes that affect only public sources Bool be skipped.
208 209 210 |
# File 'lib/validator.rb', line 208 def ignore_public_only_results @ignore_public_only_results end |
#linter ⇒ Specification::Linter (readonly)
Returns the linter instance from CocoaPods Core.
24 25 26 |
# File 'lib/validator.rb', line 24 def linter @linter end |
#local ⇒ Bool Also known as: local?
Uses the ‘:path` option of the Podfile.
Returns whether the validation should be performed against the root of the podspec instead to its original source.
182 183 184 |
# File 'lib/validator.rb', line 182 def local @local end |
#no_clean ⇒ Bool
Returns whether the linter should not clean up temporary files for inspection.
169 170 171 |
# File 'lib/validator.rb', line 169 def no_clean @no_clean end |
#no_subspecs ⇒ Bool
Returns Whether the validator should validate all subspecs.
195 196 197 |
# File 'lib/validator.rb', line 195 def no_subspecs @no_subspecs end |
#only_subspec ⇒ String
Returns name of the subspec to check, if nil all subspecs are checked.
191 192 193 |
# File 'lib/validator.rb', line 191 def only_subspec @only_subspec end |
#quick ⇒ Bool
Returns whether the validation should skip the checks that requires the download of the library.
164 165 166 |
# File 'lib/validator.rb', line 164 def quick @quick end |
#results ⇒ Object (readonly)
Returns the value of attribute results.
219 220 221 |
# File 'lib/validator.rb', line 219 def results @results end |
#skip_import_validation ⇒ Object Also known as: skip_import_validation?
Returns the value of attribute skip_import_validation.
210 211 212 |
# File 'lib/validator.rb', line 210 def skip_import_validation @skip_import_validation end |
#skip_tests ⇒ Bool
Returns Whether the validator should skip building and running tests.
199 200 201 |
# File 'lib/validator.rb', line 199 def skip_tests @skip_tests end |
#swift_version ⇒ String
Returns the SWIFT_VERSION to use for validation.
258 259 260 261 262 263 264 265 |
# File 'lib/validator.rb', line 258 def swift_version return @swift_version unless @swift_version.nil? if (version = spec.swift_version) || (version = dot_swift_version) @swift_version = version.to_s else DEFAULT_SWIFT_VERSION end end |
#use_frameworks ⇒ Bool
Returns Whether frameworks should be used for the installation.
203 204 205 |
# File 'lib/validator.rb', line 203 def use_frameworks @use_frameworks end |
Instance Method Details
#dot_swift_version ⇒ String
Returns the SWIFT_VERSION in the .swift-version file or nil.
273 274 275 276 277 278 |
# File 'lib/validator.rb', line 273 def dot_swift_version return unless file swift_version_path = file.dirname + '.swift-version' return unless swift_version_path.exist? swift_version_path.read.strip end |
#failure_reason ⇒ Object
135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 |
# File 'lib/validator.rb', line 135 def failure_reason results_by_type = results.group_by(&:type) results_by_type.default = [] return nil if validated? reasons = [] if (size = results_by_type[:error].size) && size > 0 reasons << "#{size} #{'error'.pluralize(size)}" end if !allow_warnings && (size = results_by_type[:warning].size) && size > 0 reason = "#{size} #{'warning'.pluralize(size)}" pronoun = size == 1 ? 'it' : 'them' reason << " (but you can use `--allow-warnings` to ignore #{pronoun})" if reasons.empty? reasons << reason end if results.all?(&:public_only) reasons << 'all results apply only to public specs, but you can use ' \ '`--private` to ignore them if linting the specification for a private pod' end reasons.to_sentence end |
#file ⇒ Pathname
Returns the path of the ‘podspec` file where #spec is defined.
54 55 56 |
# File 'lib/validator.rb', line 54 def file @linter.file end |
#print_results ⇒ void
This method returns an undefined value.
Prints the result of the validation to the user.
98 99 100 |
# File 'lib/validator.rb', line 98 def print_results UI.puts end |
#result_color ⇒ Symbol
Returns The color, which should been used to display the result. One of: ‘:green`, `:yellow`, `:red`.
243 244 245 246 247 248 |
# File 'lib/validator.rb', line 243 def result_color case result_type when :error then :red when :warning then :yellow else :green end end |
#result_type ⇒ Symbol
Returns The type, which should been used to display the result. One of: ‘:error`, `:warning`, `:note`.
230 231 232 233 234 235 236 237 238 |
# File 'lib/validator.rb', line 230 def result_type applicable_results = results applicable_results = applicable_results.reject(&:public_only?) if ignore_public_only_results types = applicable_results.map(&:type).uniq if types.include?(:error) then :error elsif types.include?(:warning) then :warning else :note end end |
#results_message ⇒ Object
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/validator.rb', line 102 def = '' results.each do |result| if result.platforms == [:ios] = '[iOS] ' elsif result.platforms == [:osx] = '[OSX] ' elsif result.platforms == [:watchos] = '[watchOS] ' elsif result.platforms == [:tvos] = '[tvOS] ' end = '' if result.is_a?(Result) subspecs = result.subspecs.uniq if subspecs.count > 2 = '[' + subspecs[0..2].join(', ') + ', and more...] ' elsif subspecs.count > 0 = '[' + subspecs.join(',') + '] ' end end case result.type when :error then type = 'ERROR' when :warning then type = 'WARN' when :note then type = 'NOTE' else raise "#{result.type}" end << " - #{type.ljust(5)} | #{}#{}#{result.attribute_name}: #{result.}\n" end << "\n" end |
#spec ⇒ Specification
Returns the specification to lint.
47 48 49 |
# File 'lib/validator.rb', line 47 def spec @linter.spec end |
#uses_swift? ⇒ Boolean
Returns Whether any of the pod targets part of this validator use Swift or not.
282 283 284 |
# File 'lib/validator.rb', line 282 def uses_swift? @installer.pod_targets.any?(&:uses_swift?) end |
#validate ⇒ Bool
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'lib/validator.rb', line 72 def validate @results = [] # Replace default spec with a subspec if asked for a_spec = spec if spec && @only_subspec subspec_name = @only_subspec.start_with?(spec.root.name) ? @only_subspec : "#{spec.root.name}/#{@only_subspec}" a_spec = spec.subspec_by_name(subspec_name, true, true) @subspec_name = a_spec.name end UI.print " -> #{a_spec ? a_spec.name : file.basename}\r" unless config.silent? $stdout.flush perform_linting perform_extensive_analysis(a_spec) if a_spec && !quick UI.puts ' -> '.send(result_color) << (a_spec ? a_spec.to_s : file.basename.to_s) print_results validated? end |
#validated? ⇒ Boolean
223 224 225 |
# File 'lib/validator.rb', line 223 def validated? result_type != :error && (result_type != :warning || allow_warnings) end |
#validation_dir ⇒ Pathname
Returns the temporary directory used by the linter.
252 253 254 |
# File 'lib/validator.rb', line 252 def validation_dir @validation_dir ||= Pathname(Dir.mktmpdir(['CocoaPods-Lint-', "-#{spec.name}"])) end |