class Pod::Command::Spec::Lint

Public Class Methods

new(argv) click to toggle source
Calls superclass method Pod::Command::new
# File lib/cocoapods/command/spec/lint.rb, line 40
def initialize(argv)
  @quick           = argv.flag?('quick')
  @allow_warnings  = argv.flag?('allow-warnings')
  @clean           = argv.flag?('clean', true)
  @fail_fast       = argv.flag?('fail-fast', false)
  @subspecs        = argv.flag?('subspecs', true)
  @only_subspec    = argv.option('subspec')
  @use_frameworks  = !argv.flag?('use-libraries')
  @source_urls     = argv.option('sources', 'https://github.com/CocoaPods/Specs.git').split(',')
  @platforms       = argv.option('platforms', '').split(',')
  @private         = argv.flag?('private', false)
  @swift_version   = argv.option('swift-version', nil)
  @skip_import_validation = argv.flag?('skip-import-validation', false)
  @skip_tests = argv.flag?('skip-tests', false)
  @podspecs_paths = argv.arguments!
  super
end
options() click to toggle source
Calls superclass method Pod::Command::options
# File lib/cocoapods/command/spec/lint.rb, line 17
def self.options
  [
    ['--quick', 'Lint skips checks that would require to download and build the spec'],
    ['--allow-warnings', 'Lint validates even if warnings are present'],
    ['--subspec=NAME', 'Lint validates only the given subspec'],
    ['--no-subspecs', 'Lint skips validation of subspecs'],
    ['--no-clean', 'Lint leaves the build directory intact for inspection'],
    ['--fail-fast', 'Lint stops on the first failing platform or subspec'],
    ['--use-libraries', 'Lint uses static libraries to install the spec'],
    ['--sources=https://github.com/artsy/Specs,master', 'The sources from which to pull dependent pods ' \
     '(defaults to https://github.com/CocoaPods/Specs.git). ' \
     'Multiple sources must be comma-delimited.'],
    ['--platforms=ios,macos', 'Lint against specific platforms' \
      '(defaults to all platforms supported by the podspec).' \
      'Multiple platforms must be comma-delimited'],
    ['--private', 'Lint skips checks that apply only to public specs'],
    ['--swift-version=VERSION', 'The SWIFT_VERSION that should be used to lint the spec. ' \
     'This takes precedence over a .swift-version file.'],
    ['--skip-import-validation', 'Lint skips validating that the pod can be imported'],
    ['--skip-tests', 'Lint skips building and running tests during validation'],
  ].concat(super)
end

Public Instance Methods

run() click to toggle source
# File lib/cocoapods/command/spec/lint.rb, line 58
def run
  UI.puts
  failure_reasons = []
  podspecs_to_lint.each do |podspec|
    validator                = Validator.new(podspec, @source_urls, @platforms)
    validator.quick          = @quick
    validator.no_clean       = !@clean
    validator.fail_fast      = @fail_fast
    validator.allow_warnings = @allow_warnings
    validator.no_subspecs    = !@subspecs || @only_subspec
    validator.only_subspec   = @only_subspec
    validator.use_frameworks = @use_frameworks
    validator.ignore_public_only_results = @private
    validator.swift_version = @swift_version
    validator.skip_import_validation = @skip_import_validation
    validator.skip_tests = @skip_tests
    validator.validate
    failure_reasons << validator.failure_reason

    unless @clean
      UI.puts "Pods workspace available at `#{validator.validation_dir}/App.xcworkspace` for inspection."
      UI.puts
    end
  end

  count = podspecs_to_lint.count
  UI.puts "Analyzed #{count} #{'podspec'.pluralize(count)}.\n\n"

  failure_reasons.compact!
  if failure_reasons.empty?
    lint_passed_message = count == 1 ? "#{podspecs_to_lint.first.basename} passed validation." : 'All the specs passed validation.'
    UI.puts lint_passed_message.green << "\n\n"
  else
    raise Informative, if count == 1
                         "The spec did not pass validation, due to #{failure_reasons.first}."
                       else
                         "#{failure_reasons.count} out of #{count} specs failed validation."
                       end
  end
  podspecs_tmp_dir.rmtree if podspecs_tmp_dir.exist?
end

Private Instance Methods

podspecs_tmp_dir() click to toggle source
# File lib/cocoapods/command/spec/lint.rb, line 131
def podspecs_tmp_dir
  Pathname.new(Dir.tmpdir) + 'CocoaPods/Lint_podspec'
end
podspecs_to_lint() click to toggle source
# File lib/cocoapods/command/spec/lint.rb, line 102
def podspecs_to_lint
  @podspecs_to_lint ||= begin
    files = []
    @podspecs_paths << '.' if @podspecs_paths.empty?
    @podspecs_paths.each do |path|
      if path =~ %r{https?://}
        require 'cocoapods/open-uri'
        output_path = podspecs_tmp_dir + File.basename(path)
        output_path.dirname.mkpath
        begin
          open(path) do |io|
            output_path.open('w') { |f| f << io.read }
          end
        rescue => e
          raise Informative, "Downloading a podspec from `#{path}` failed: #{e}"
        end
        files << output_path
      elsif (pathname = Pathname.new(path)).directory?
        files += Pathname.glob(pathname + '*.podspec{.json,}')
        raise Informative, 'No specs found in the current directory.' if files.empty?
      else
        files << (pathname = Pathname.new(path))
        raise Informative, "Unable to find a spec named `#{path}'." unless pathname.exist? && path.include?('.podspec')
      end
    end
    files
  end
end