begin

require 'rspec/core/rake_task'

rescue LoadError else

def define_spec_task(name, options={})
  desc options[:desc]
  begin
    require 'rspec/core/rake_task'
  rescue LoadError
  else
    RSpec::Core::RakeTask.new name do |t|
      t.rspec_opts ||= []
      t.rspec_opts << "--backtrace" if options[:backtrace]

      debugger_gem = %w(pry-byebug pry-debugger).detect do |gem|
        `bundle show #{gem} 2>&1 >/dev/null`
        $?.success?
      end
      if debugger_gem && options[:debug] != false
        t.rspec_opts << "--require #{debugger_gem}"
      end

      t.rspec_opts << "--format #{options[:format]}" if options.key?(:format)
      t.rspec_opts << '--no-profile' if options[:profile] == false
      t.rspec_opts << '--warnings' if options[:warnings]
      t.pattern = options[:pattern] || %w(spec/*_spec.rb spec/**/*_spec.rb)
    end
  end
end

define_spec_task :spec, desc: 'Run specs', profile: true

namespace :spec do
  uncommitted_files_in_spec = `git ls-files --modified --others spec/* spec/**/*`.split("\n")
  uncommitted_spec_files = `git ls-files --modified --others spec/*_spec.rb spec/**/*_spec.rb`.split("\n")
  nonspec_uncommitted_files_in_spec = uncommitted_files_in_spec -
                                      uncommitted_spec_files
  if nonspec_uncommitted_files_in_spec.empty?
    if uncommitted_spec_files.empty?
      desc 'Run uncommitted specs (none)'
      task :uncommitted do
        puts 'No uncommitted specs to run'
      end
    else
      noun_phrase = "#{uncommitted_spec_files.length} uncommitted spec file#{(uncommitted_spec_files.length == 1) ? nil : 's'}"
      desc = "Run #{noun_phrase}"
      define_spec_task :uncommitted, desc:    desc,
                                     pattern: uncommitted_spec_files
    end
  else
    noun_phrase = "#{uncommitted_files_in_spec.length} uncommitted file#{uncommitted_files_in_spec.length == 1 ? nil : 's'}"
    desc = "Run all specs because of #{noun_phrase} in 'spec'"
    define_spec_task :uncommitted, desc: desc, pattern: 'spec'
  end

  define_spec_task :warnings, desc:     'Run specs with Ruby warnings enabled',
                              format:   :progress,
                              profile:  false,
                              warnings: true
end

# Support the 'gem test' command.
define_spec_task :test, desc: '', backtrace: true,
                                  debug:     false,
                                  format:    :progress,
                                  profile:   false

end