nulogy/Gorgon

View on GitHub
lib/gorgon/command.rb

Summary

Maintainability
A
0 mins
Test Coverage
require "rubygems"
require 'gorgon'
require 'gorgon/originator'
require 'gorgon/listener'
require 'gorgon/rsync_daemon'
require 'gorgon/worker_manager'
require 'gorgon/ping_service'
require 'gorgon/gem_service'
require 'gorgon/version'
require 'gorgon/listener_installer'
require 'gorgon/settings/initial_files_creator'

module Gorgon
  class Command
    WELCOME_MESSAGE = "Welcome to Gorgon #{Gorgon::VERSION}"
    USAGE = <<-EOT
USAGE: gorgon <command> [<args>]

COMMANDS:
  start                       remotely run all tests specified in gorgon.json
  listen                      start a listener process using the settings in gorgon_listener.json
  ping                        ping listeners and show hosts and gorgon's version they are running
  init [<framework>]          create initial files for current project
  install_listener            run gorgon listener as a daemon process
  start_rsync <directory>     start rsync daemon. Run this command in File Server
  stop_rsync                  stop rsync daemon.
  gem command [<options>...]  execute the gem command on every listener and shutdown listener.
                              (e.g. 'gorgon gem install bunny --version 1.0.0')

OPTIONS:
  -h, --help       print this message
  -v, --version    print gorgon version
    EOT

    COMMAND_WHITELIST = %w(help version start listen start_rsync stop_rsync manage_workers ping gem init install_listener)

    attr_reader :argv

    def initialize(argv)
      if argv.empty?
        @argv = ['start']
      else
        @argv = argv
      end
    end

    def self.run(argv = ARGV)
      new(argv).run_command
    end

    def run_command
      command = parse(argv.shift)
      if COMMAND_WHITELIST.include?(command)
        puts WELCOME_MESSAGE unless ['version', 'help'].include?(command)
        send(command)
      else
        write_error_message(command)
      end
    end

    def help
      write_usage
      exit(0)
    end

    def version
      puts Gorgon::VERSION
      exit(0)
    end

    def start
      o = Originator.new
      exit o.originate
    end

    def listen
      l = Listener.new
      l.listen
    end

    def start_rsync
      puts "Starting rsync daemon..."
      directory = argv[0]
      exit 1 unless RsyncDaemon.start directory
      puts "Rsync Daemon is running. Use 'gorgon stop_rsync' to kill it."
    end

    def stop_rsync
      puts "Stopping rsync daemon..."
      exit 1 unless RsyncDaemon.stop
      puts "Done"
    end

    def manage_workers
      config_path = ENV["GORGON_CONFIG_PATH"]

      manager = WorkerManager.build config_path
      manager.manage

      # For some reason I have to 'exit' here, otherwise WorkerManager process crashes
      exit
    end

    def ping
      PingService.new.ping_listeners
    end

    def gem
      gem_opts = argv.join(" ")
      GemService.new.run(gem_opts)
    end

    def init
      framework = argv[0]
      Settings::InitialFilesCreator.run(framework)
    end

    def install_listener
      ListenerInstaller.install
    end

    private

    def write_usage
      puts USAGE
    end

    def parse(command)
      case command
      when '--version', '-v'
        'version'
      when 'help', '--help', '-h'
        'help'
      else
        command
      end
    end

    def write_error_message(command)
      puts "Error: Command '#{command}' not recognized"
      write_usage
      exit(1)
    end
  end
end