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.
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
-
#default_help ⇒ String
What you see when you do ‘wf –help’.
-
#docopt_hash ⇒ Hash
Command descriptions for docopt.
-
#import_command(f) ⇒ Object
Load a command description from a file.
-
#initialize(args) ⇒ WavefrontCliController
constructor
A new instance of WavefrontCliController.
-
#load_commands ⇒ Hash
Each command is defined in its own file.
-
#load_sdk(cmd, opts) ⇒ Object
Get the SDK class we need to run the command we’ve been given.
-
#parse_args ⇒ Object
Parse the input.
- #parse_opts(o) ⇒ Object
- #run_command(hook) ⇒ Object
-
#sanitize_keys(h) ⇒ Object
Symbolize, and remove dashes from option keys.
Constructor Details
#initialize(args) ⇒ WavefrontCliController
Returns a new instance of WavefrontCliController.
27 28 29 30 31 32 33 34 35 36 |
# File 'lib/wavefront-cli/controller.rb', line 27 def initialize(args) @args = args @cmds = load_commands @usage = docopt_hash cmd, opts = parse_args @opts = parse_opts(opts) pp @opts if @opts[:debug] hook = load_sdk(cmd, @opts) run_command(hook) end |
Instance Attribute Details
#args ⇒ Object (readonly)
Returns the value of attribute args.
25 26 27 |
# File 'lib/wavefront-cli/controller.rb', line 25 def args @args end |
#cmds ⇒ Object (readonly)
Returns the value of attribute cmds.
25 26 27 |
# File 'lib/wavefront-cli/controller.rb', line 25 def cmds @cmds end |
#opts ⇒ Object (readonly)
Returns the value of attribute opts.
25 26 27 |
# File 'lib/wavefront-cli/controller.rb', line 25 def opts @opts end |
#tw ⇒ Object (readonly)
Returns the value of attribute tw.
25 26 27 |
# File 'lib/wavefront-cli/controller.rb', line 25 def tw @tw end |
#usage ⇒ Object (readonly)
Returns the value of attribute usage.
25 26 27 |
# File 'lib/wavefront-cli/controller.rb', line 25 def usage @usage end |
Instance Method Details
#default_help ⇒ String
What you see when you do ‘wf –help’
41 42 43 44 45 46 47 |
# File 'lib/wavefront-cli/controller.rb', line 41 def default_help s = "Wavefront CLI\n\nUsage:\n #{CMD} command [options]\n" \ " #{CMD} --version\n #{CMD} --help\n\nCommands:\n" cmds.sort.each { |k, v| s.<< format(" %-18s %s\n", k, v.description) } s.<< "\nUse '#{CMD} <command> --help' for further information.\n" end |
#docopt_hash ⇒ Hash
Returns command descriptions for docopt.
51 52 53 54 55 |
# File 'lib/wavefront-cli/controller.rb', line 51 def docopt_hash cmds.each_with_object(default: default_help) do |(k, v), ret| ret[k.to_sym] = v.docopt end end |
#import_command(f) ⇒ Object
Load a command description from a file. Each is in its own class
return [Class] new class object defining command.
120 121 122 123 124 125 |
# File 'lib/wavefront-cli/controller.rb', line 120 def import_command(f) return if f.extname != '.rb' || f.basename.to_s == 'base.rb' k_name = f.basename.to_s[0..-4] require(CMD_DIR + k_name) Object.const_get("WavefrontCommand#{k_name.capitalize}").new end |
#load_commands ⇒ Hash
Each command is defined in its own file. Dynamically load all those commands.
108 109 110 111 112 113 |
# File 'lib/wavefront-cli/controller.rb', line 108 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 |
#load_sdk(cmd, opts) ⇒ Object
Get the SDK class we need to run the command we’ve been given.
83 84 85 86 87 88 89 90 |
# File 'lib/wavefront-cli/controller.rb', line 83 def load_sdk(cmd, opts) require_relative File.join('.', cmds[cmd].sdk_file) Object.const_get('WavefrontCli').const_get(cmds[cmd].sdk_class).new(opts) rescue WavefrontCli::Exception::UnhandledCommand abort 'Fatal error. Unsupported command.' rescue StandardError => e p e end |
#parse_args ⇒ Object
Parse the input. The first Docopt.docopt handles the default options, the second works on the command.
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/wavefront-cli/controller.rb', line 60 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.keys.include?(cmd) begin [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 end |
#parse_opts(o) ⇒ Object
76 77 78 |
# File 'lib/wavefront-cli/controller.rb', line 76 def parse_opts(o) WavefrontCli::OptHandler.new(o).opts end |
#run_command(hook) ⇒ Object
92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/wavefront-cli/controller.rb', line 92 def run_command(hook) hook.validate_opts hook.run rescue WavefrontCli::Exception::UnsupportedOutput => e abort e. rescue StandardError => e $stderr.puts "general error: #{e}" $stderr.puts "re-run with '-D' for stack trace." unless opts[:debug] $stderr.puts "Backtrace:\n\t#{e.backtrace.join("\n\t")}" if opts[:debug] abort end |
#sanitize_keys(h) ⇒ Object
Symbolize, and remove dashes from option keys
return [Hash] h with modified keys
132 133 134 |
# File 'lib/wavefront-cli/controller.rb', line 132 def sanitize_keys(h) h.each_with_object({}) { |(k, v), r| r[k.to_s.delete('-').to_sym] = v } end |