lfender6445/auto_pilot

View on GitHub
bin/autopilot

Summary

Maintainability
Test Coverage
#!/usr/bin/env ruby

require 'pry' if ENV['DEBUG']

$LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')

begin
  require 'auto_pilot'
rescue LoadError
  require 'rubygems'
  require 'auto_pilot'
end

require 'fileutils'

def get_root
  Gem::Specification.find_by_name('auto_pilot').gem_dir
rescue Gem::LoadError
  Dir.pwd
end

ROOT = get_root

class Application
  CONF_TEMPLATE = 'auto_pilot_config.rb'

  def initialize
    show_banner
    ask_user_for_configuration
    download_answers_and_write_files
  end

  private

  def ask_user_for_configuration
    if File.exist?("#{Dir.pwd}/#{CONF_TEMPLATE}")
      log.out "found existing configuration at #{Dir.pwd}/#{CONF_TEMPLATE}"
      load_configuration
    else
      log.out 'do you want to create a configuration file? y/n'
      answer = $stdin.gets.chomp
      if answer == 'y'
        add_configuration_file
        load_configuration
        update_config_with_user
        ask_user_to_keep_going
      else
        use_default_configuration
      end
    end
  end

  def ask_user_to_keep_going
    log.out 'would you like to modify your configuration? y/n'
    answer = $stdin.gets.chomp
    if  answer == 'y'
      log.out 'update ./auto_pilot_config.rb, resume by running `autopilot`'

      abort
    end
  end

  def update_config_with_user
    id = ask_for_user_id
    update_config_with_answer if id.nil? || id == ''
    template = "#{Dir.pwd}/#{CONF_TEMPLATE}"
    text = File.read(template)
    new_contents = text.gsub(/userid/, AutoPilot.configuration.user_id)
    File.open(template, 'w') { |file| file.puts new_contents }
    reload_config
  end

  def load_configuration
    load "#{Dir.pwd}/#{CONF_TEMPLATE}"
  end
  alias_method :reload_config, :load_configuration

  def use_default_configuration
    AutoPilot.configure do |config|
      config.user_id   = ask_for_user_id
      config.format = [:md]
      config.folder = "#{Dir.pwd}/stackoverflow"
      config.disable_front_matter = false
      config.max_pages = 2
    end
  end

  def ask_for_user_id
    log.out 'enter a stackoverflow id (can be found in your profile url):'
    answer = $stdin.gets.chomp
    if answer.nil? or answer == ''
      log.red '- invalid user id, try again'
      ask_for_user_id
    else
      AutoPilot.configuration.user_id = answer
    end
  end

  def copy_with_path(src, dst)
    FileUtils.mkdir_p(File.dirname(dst))
    FileUtils.cp(src, dst)
  end

  def add_configuration_file
    template = "#{ROOT}/lib/auto_pilot/templates/auto_pilot_config.rb"
    copy_with_path(template, CONF_TEMPLATE)
    log.green "- created ./#{CONF_TEMPLATE}"
    update_gitignore
  end

  def update_gitignore
    gitignore = "#{Dir.pwd}/.gitignore"
    if File.exist?(gitignore)
      unless already_updated_gitignore
        log.out 'would you like to add configuration to .gitignore? (recommended) y/n'
        answer = $stdin.gets.chomp
        if answer == 'y'
          open(gitignore, 'a') do |f|
            f.puts '/auto_pilot_config.rb'
          end
          log.green '- updated .gitignore'
        end
      end
    end
  end

  def already_updated_gitignore
    File.read("#{Dir.pwd}/.gitignore").match(CONF_TEMPLATE)
  end

  def download_answers_and_write_files
    AutoPilot.write_files(AutoPilot.get_api_answers)
  end

  def log
    AutoPilot::Log
  end

  def show_banner
    puts <<-BLOCK.unindent
    *************
    -=AUTOPILOT=-
    *************
    BLOCK
  end
end

Application.new