Class: ActionCommand::InputOutput
- Inherits:
-
Object
- Object
- ActionCommand::InputOutput
- Defined in:
- lib/action_command/input_output.rb
Overview
A static description of the input and output from a given command. Although adding this adds a bunch of documentation and validation, it is not required. If you don’t want to specify your input and output, you can just access the hash you passed into the command as @params
Constant Summary collapse
- OPTIONAL =
shorthand to indicate the parameter is optional.
{ optional: true }.freeze
Instance Attribute Summary collapse
-
#desc ⇒ Object
readonly
Returns the description for this command.
Instance Method Summary collapse
- #help?(args) ⇒ Boolean
-
#initialize(action, desc) ⇒ InputOutput
constructor
Do not use this.
-
#input(sym, desc, opts = {}, &_block) ⇒ Object
Defines input for a command.
-
#input_count ⇒ Object
the number of input parameters for this command.
-
#keys ⇒ Object
An array with the set of parameter symbols this command accepts.
-
#output(sym, desc, opts = {}) ⇒ Object
Defines output for a command.
-
#print_output(result) ⇒ Object
print out the defined output of the command.
-
#process_input(dest, args) ⇒ Object
Goes through, and assigns the value for each declared parameter to an accessor with the same name, validating that required parameters are not missing.
-
#process_output(dest, result) ⇒ Object
Goes through, and makes sure that required output parameters exist.
-
#rake_input(rake_arg) ⇒ Object
convert rake task arguments to a standard hash.
-
#should_validate(dest) ⇒ Object
True if the executable is not in a testing context.
-
#show_help ⇒ Object
displays the help for this command.
-
#validate_input(dest, args) ⇒ Object
Validates that the specified parameters are valid for this input description.
Constructor Details
#initialize(action, desc) ⇒ InputOutput
Do not use this. Instead, implment self.describe_io in your command subclass, and call the method ActionCommand#self.describe_io from within it, returning its result.
14 15 16 17 18 19 20 21 22 |
# File 'lib/action_command/input_output.rb', line 14 def initialize(action, desc) @action = action @desc = desc @input = [] @output = [] # universal parameters. # input(:help, 'Help on this command', OPTIONAL) end |
Instance Attribute Details
#desc ⇒ Object (readonly)
Returns the description for this command.
103 104 105 |
# File 'lib/action_command/input_output.rb', line 103 def desc @desc end |
Instance Method Details
#help?(args) ⇒ Boolean
106 107 108 109 110 |
# File 'lib/action_command/input_output.rb', line 106 def help?(args) first_arg_sym = @input.first[:symbol] first_arg_val = args[first_arg_sym] return first_arg_val == 'help' end |
#input(sym, desc, opts = {}, &_block) ⇒ Object
Defines input for a command
125 126 127 |
# File 'lib/action_command/input_output.rb', line 125 def input(sym, desc, opts = {}, &_block) insert_io(@input, sym, desc, opts) end |
#input_count ⇒ Object
the number of input parameters for this command.
25 26 27 |
# File 'lib/action_command/input_output.rb', line 25 def input_count return @input.length end |
#keys ⇒ Object
Returns an array with the set of parameter symbols this command accepts.
139 140 141 |
# File 'lib/action_command/input_output.rb', line 139 def keys @input.collect { |p| p[:symbol] } end |
#output(sym, desc, opts = {}) ⇒ Object
Defines output for a command
134 135 136 |
# File 'lib/action_command/input_output.rb', line 134 def output(sym, desc, opts = {}) insert_io(@output, sym, desc, opts) end |
#print_output(result) ⇒ Object
print out the defined output of the command
94 95 96 97 98 99 100 |
# File 'lib/action_command/input_output.rb', line 94 def print_output(result) @output.each do |param| sym = param[:symbol] puts "#{sym}: #{result[sym]}" end end |
#process_input(dest, args) ⇒ Object
Goes through, and assigns the value for each declared parameter to an accessor with the same name, validating that required parameters are not missing
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# File 'lib/action_command/input_output.rb', line 55 def process_input(dest, args) # pass down predefined attributes. dest.parent = args[:parent] dest.test = args[:test] return unless validate_input(dest, args) @input.each do |param| sym = param[:symbol] if args.key? sym sym_assign = "#{sym}=".to_sym dest.send(sym_assign, args[sym]) end end end |
#process_output(dest, result) ⇒ Object
Goes through, and makes sure that required output parameters exist
72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/action_command/input_output.rb', line 72 def process_output(dest, result) return unless result.ok? && should_validate(dest) @output.each do |param| sym = param[:symbol] unless result.key?(sym) opts = param[:opts] raise ArgumentError, "Missing required value #{sym} in output" unless opts[:optional] end end end |
#rake_input(rake_arg) ⇒ Object
convert rake task arguments to a standard hash.
85 86 87 88 89 90 91 |
# File 'lib/action_command/input_output.rb', line 85 def rake_input(rake_arg) params = {} rake_arg.each do |key, val| params[key] = val end return params end |
#should_validate(dest) ⇒ Object
Returns true if the executable is not in a testing context.
31 32 33 |
# File 'lib/action_command/input_output.rb', line 31 def should_validate(dest) return dest.test_context? end |
#show_help ⇒ Object
displays the help for this command
113 114 115 116 117 |
# File 'lib/action_command/input_output.rb', line 113 def show_help puts "#{@action.name}: #{desc}" print_params('Input', @input) print_params('Output', @output) end |
#validate_input(dest, args) ⇒ Object
Validates that the specified parameters are valid for this input description.
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
# File 'lib/action_command/input_output.rb', line 37 def validate_input(dest, args) return true unless should_validate(dest) @input.each do |p| val = args[p[:symbol]] # if the argument has a value, no need to test whether it is optional. next unless !val || val == '*' || val == '' opts = p[:opts] unless opts[:optional] raise ArgumentError, "You must specify the required input #{p[:symbol]}" end end return true end |