class Beez::CLI

Attributes

launcher[RW]

Public Instance Methods

parse(argv = ARGV) click to toggle source
# File lib/beez/cli.rb, line 15
def parse(argv = ARGV)
  parse_options(argv)
end
run() click to toggle source
# File lib/beez/cli.rb, line 19
def run
  boot

  self_read, self_write = IO.pipe
  sigs = %w[INT TERM]
  sigs.each do |sig|
    trap sig do
      self_write.write("#{sig}\n")
    end
  rescue ArgumentError
    logger.warn "Signal #{sig} not supported"
  end

  launch(self_read)
end

Private Instance Methods

boot() click to toggle source
# File lib/beez/cli.rb, line 80
def boot
  ENV["RACK_ENV"] = ENV["RAILS_ENV"] = config.env

  if File.directory?(config.require)
    require 'rails'
    if ::Rails::VERSION::MAJOR < 4
      raise "Beez does not supports this version of Rails"
    else
      require File.expand_path("#{config.require}/config/environment.rb")
      logger.info "Booted Rails #{::Rails.version} application in #{config.env} environment"
    end
  else
    require config.require
  end
end
config() click to toggle source
# File lib/beez/cli.rb, line 135
def config
  ::Beez.config
end
handle_signal(signal) click to toggle source
# File lib/beez/cli.rb, line 119
def handle_signal(signal)
  handler = signal_handlers[signal]
  if handler
    handler.call(self)
  else
    logger.warn "No signal handler for #{signal}"
  end
end
launch(self_read) click to toggle source
# File lib/beez/cli.rb, line 96
def launch(self_read)
  @launcher = ::Beez::Launcher.new

  if config.env == "development" && $stdout.tty?
    logger.info "Starting processing, hit Ctrl-C to stop"
  end

  begin
    launcher.start

    while readable_io = IO.select([self_read])
      signal = readable_io.first[0].gets.strip
      handle_signal(signal)
    end
  rescue Interrupt
    logger.info "Shutting down"
    launcher.stop
    logger.info "Bye!"

    exit(0)
  end
end
logger() click to toggle source
# File lib/beez/cli.rb, line 139
def logger
  ::Beez.logger
end
option_parser() click to toggle source
# File lib/beez/cli.rb, line 41
def option_parser
  OptionParser.new.tap do |p|
    p.on "-e", "--env ENV", "Application environment" do |arg|
      config.env = arg
    end

    p.on "-r", "--require [PATH|DIR]", "Location of Rails application with workers or file to require" do |arg|
      if !File.exist?(arg) ||
          (File.directory?(arg) && !File.exist?("#{arg}/config/application.rb"))
        raise ArgumentError, "#{arg} is not a ruby file nor a rails application"
      else
        config.require = arg
      end
    end

    p.on "-t", "--timeout NUM", "Shutdown timeout" do |arg|
      timeout = Integer(arg)
      raise ArgumentError, "timeout must be a positive integer" if timeout <= 0
      config.timeout = timeout
    end

    p.on "-v", "--verbose", "Print more verbose output" do |arg|
      ::Beez.logger.level = ::Logger::DEBUG
    end

    p.on "-V", "--version", "Print version and exit" do |arg|
      puts "Beez #{::Beez::VERSION}"
      exit(0)
    end

    p.banner = "Usage: beez [options]"
    p.on_tail "-h", "--help", "Show help" do
      puts p

      exit(1)
    end
  end
end
parse_options(argv) click to toggle source
# File lib/beez/cli.rb, line 37
def parse_options(argv)
  option_parser.parse!(argv)
end
signal_handlers() click to toggle source
# File lib/beez/cli.rb, line 128
def signal_handlers
  {
    "INT" => ->(cli) { raise Interrupt },
    "TERM" => ->(cli) { raise Interrupt },
  }
end