Class: WavefrontCliController
- Inherits:
-
Object
- Object
- WavefrontCliController
- Defined in:
- lib/wavefront-cli/controller.rb
Overview
Dynamically generate a CLI interface from files which describe each subcomand.
Constant Summary
Constants included from WavefrontCli::Constants
WavefrontCli::Constants::ALL_PAGE_SIZE, WavefrontCli::Constants::DEFAULT_CONFIG, WavefrontCli::Constants::DEFAULT_OPTS, WavefrontCli::Constants::EVENT_STATE_DIR, WavefrontCli::Constants::HUMAN_TIME_FORMAT, WavefrontCli::Constants::HUMAN_TIME_FORMAT_MS, WavefrontCli::Constants::SEARCH_SPLIT
Instance Attribute Summary collapse
-
#args ⇒ Object
readonly
Returns the value of attribute args.
-
#cmds ⇒ Object
readonly
Returns the value of attribute cmds.
-
#opts ⇒ Object
readonly
Returns the value of attribute opts.
-
#tw ⇒ Object
readonly
Returns the value of attribute tw.
-
#usage ⇒ Object
readonly
Returns the value of attribute usage.
Instance Method Summary collapse
- #backtrace_message(err) ⇒ Object
-
#cli_class(cmd, opts) ⇒ Object
Get the CLI class we need to run the command we’ve been given.
-
#default_help ⇒ String
What you see when you do ‘wf –help’ rubocop:disable Metrics/MethodLength.
-
#docopt_hash ⇒ Hash
Command descriptions for docopt.
- #handle_missing_credentials(error) ⇒ Object
-
#import_command(path) ⇒ Object
Load a command description from a file.
-
#initialize(args) ⇒ WavefrontCliController
constructor
A new instance of WavefrontCliController.
- #load_cli_class(cmd, opts) ⇒ Object
-
#load_commands ⇒ Hash
Each command is defined in its own file.
-
#parse_args ⇒ Object
Parse the input.
-
#parse_cmd(cmd) ⇒ Object
Parse a command.
- #parse_opts(options) ⇒ Object
- #run_command(cli_class_obj) ⇒ Object
-
#sanitize_keys(options) ⇒ Object
Symbolize, and remove dashes from option keys.
Methods included from WavefrontCli::ExceptionMixins
Constructor Details
#initialize(args) ⇒ WavefrontCliController
Returns a new instance of WavefrontCliController.
34 35 36 37 38 39 40 41 42 |
# File 'lib/wavefront-cli/controller.rb', line 34 def initialize(args) @args = args @cmds = load_commands @usage = docopt_hash cmd, opts = parse_args @opts = parse_opts(opts) cli_class_obj = cli_class(cmd, @opts) run_command(cli_class_obj) end |
Instance Attribute Details
#args ⇒ Object (readonly)
Returns the value of attribute args.
29 30 31 |
# File 'lib/wavefront-cli/controller.rb', line 29 def args @args end |
#cmds ⇒ Object (readonly)
Returns the value of attribute cmds.
29 30 31 |
# File 'lib/wavefront-cli/controller.rb', line 29 def cmds @cmds end |
#opts ⇒ Object (readonly)
Returns the value of attribute opts.
29 30 31 |
# File 'lib/wavefront-cli/controller.rb', line 29 def opts @opts end |
#tw ⇒ Object (readonly)
Returns the value of attribute tw.
29 30 31 |
# File 'lib/wavefront-cli/controller.rb', line 29 def tw @tw end |
#usage ⇒ Object (readonly)
Returns the value of attribute usage.
29 30 31 |
# File 'lib/wavefront-cli/controller.rb', line 29 def usage @usage end |
Instance Method Details
#backtrace_message(err) ⇒ Object
128 129 130 131 132 133 134 |
# File 'lib/wavefront-cli/controller.rb', line 128 def (err) if opts[:debug] warn "Backtrace:\n\t#{err.backtrace.join("\n\t")}" else puts "Re-run command with '-D' for backtrace." end end |
#cli_class(cmd, opts) ⇒ Object
Get the CLI class we need to run the command we’ve been given.
110 111 112 113 114 |
# File 'lib/wavefront-cli/controller.rb', line 110 def cli_class(cmd, opts) load_cli_class(cmd, opts) rescue StandardError => e exception_handler(e) end |
#default_help ⇒ String
What you see when you do ‘wf –help’ rubocop:disable Metrics/MethodLength
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/wavefront-cli/controller.rb', line 48 def default_help s = ['Wavefront CLI', '', 'Usage:', " #{CMD} command [options]", " #{CMD} --version", " #{CMD} --help", '', 'Commands:'] cmds.sort.each do |k, v| s.<< format(' %-18<command>s %<desc>s', command: k, desc: v.description) end s.<< '' s.<< "Use '#{CMD} <command> --help' for further information." s.join("\n") end |
#docopt_hash ⇒ Hash
Returns command descriptions for docopt.
72 73 74 75 76 |
# File 'lib/wavefront-cli/controller.rb', line 72 def docopt_hash cmds.each_with_object(default: default_help) do |(k, v), ret| ret[k.to_sym] = v.docopt end end |
#handle_missing_credentials(error) ⇒ Object
138 139 140 141 142 143 144 145 146 147 148 |
# File 'lib/wavefront-cli/controller.rb', line 138 def handle_missing_credentials(error) if DEFAULT_CONFIG.exist? && DEFAULT_CONFIG.file? abort "Credential error. #{error.}" else puts 'No credentials supplied on the command line or via ' \ 'environment variables, and no configuration file found. ' \ "Please run 'wf config setup' to create configuration." .fold(TW, 0) exit 1 end end |
#import_command(path) ⇒ Object
Load a command description from a file. Each is in its own class
return [Class] new class object defining command.
166 167 168 169 170 171 172 |
# File 'lib/wavefront-cli/controller.rb', line 166 def import_command(path) return if path.extname != '.rb' || path.basename.to_s == 'base.rb' k_name = path.basename.to_s[0..-4] require(CMD_DIR + k_name) Object.const_get("WavefrontCommand#{k_name.capitalize}").new end |
#load_cli_class(cmd, opts) ⇒ Object
116 117 118 119 |
# File 'lib/wavefront-cli/controller.rb', line 116 def load_cli_class(cmd, opts) require_relative File.join('.', cmds[cmd].sdk_file) Object.const_get('WavefrontCli').const_get(cmds[cmd].sdk_class).new(opts) end |
#load_commands ⇒ Hash
Each command is defined in its own file. Dynamically load all those commands.
154 155 156 157 158 159 |
# File 'lib/wavefront-cli/controller.rb', line 154 def load_commands CMD_DIR.children.each_with_object({}) do |f, ret| k = import_command(f) ret[k.word.to_sym] = k if k end end |
#parse_args ⇒ Object
Parse the input. The first Docopt.docopt handles the default options, the second works on the command.
81 82 83 84 85 86 87 88 |
# File 'lib/wavefront-cli/controller.rb', line 81 def parse_args Docopt.docopt(usage[:default], version: WF_CLI_VERSION, argv: args) rescue Docopt::Exit => e cmd = args.empty? ? nil : args.first.to_sym abort e. unless usage.key?(cmd) parse_cmd(cmd) end |
#parse_cmd(cmd) ⇒ Object
Parse a command.
93 94 95 96 97 98 99 |
# File 'lib/wavefront-cli/controller.rb', line 93 def parse_cmd(cmd) [cmd, sanitize_keys(Docopt.docopt(usage[cmd], argv: args))] rescue Docopt::DocoptLanguageError => e abort "Mangled command description:\n#{e.}" rescue Docopt::Exit => e abort e. end |
#parse_opts(options) ⇒ Object
101 102 103 |
# File 'lib/wavefront-cli/controller.rb', line 101 def parse_opts() WavefrontCli::OptHandler.new().opts end |
#run_command(cli_class_obj) ⇒ Object
121 122 123 124 125 126 |
# File 'lib/wavefront-cli/controller.rb', line 121 def run_command(cli_class_obj) cli_class_obj.validate_opts cli_class_obj.run rescue StandardError => e exception_handler(e) end |
#sanitize_keys(options) ⇒ Object
Symbolize, and remove dashes from option keys
return [Hash] h with modified keys
179 180 181 |
# File 'lib/wavefront-cli/controller.rb', line 179 def sanitize_keys() .transform_keys { |k| k.to_s.delete('-').to_sym } end |