require 'slop' require_relative 'command_logger' module Flydata class Cli include Helpers include CommandLoggable def initialize(args) @args = args unless $log $log = Logger.new(FLYDATA_LOG) # 2014-10-24 14:05:21 -0700 command.info: message $log.datetime_format = "%Y-%m-%d %H:%M:%S %z " $log.formatter = proc do |severity, datetime, progname, msg| "#{datetime} command.#{severity.to_s.downcase}: #{msg}\n" end end log_info("Start command.", {cmd: @args.join(' '), ver:flydata_version}) end def run unless check_environment log_error_stderr("Sorry, you have to run the installation command to use flydata. Please go to https://console.flydata.com/ and sign up.") return end begin if @args.size > 0 first_arg = @args.shift cmd, sub_cmd = parse_command(first_arg) begin cmd_cls = "Flydata::Command::#{cmd.capitalize}".constantize rescue NameError # NameError is raised when the constant is not defined in its target # file, that is, command not found. # Other exceptions mean that some other error happended. raise "Command not found: #{cmd}" end # Command class can define options for each subcommand by defining method "slop_subcommandname" slop_method = sub_cmd ? "slop_#{sub_cmd}".to_sym : :slop options = cmd_cls.respond_to?(slop_method) ? cmd_cls.send(slop_method) : Slop.new(strict: true) options.parse!(@args) cmd_obj = cmd_cls.new(options) sub_cmd ? cmd_obj.send(sub_cmd,*@args) : cmd_obj.run(*@args) else $stderr.puts usage_text(false) return end rescue => e #raise e $stderr.puts "! #{e.to_s}" $stderr.puts $stderr.puts $stderr.puts usage_text log_error_with_backtrace('Error occured during command.', {error: e, args: @args}) raise e if FLYDATA_DEBUG exit 1 end end private def check_environment FileTest.file?(flydata_api_host_file) end def parse_command(cmd) cmd.split(':') end end end