class Beaker::Command
An object that represents a “command” on a remote host. Is responsible for munging the environment correctly. Probably poorly named.
@api public
Attributes
An array of additional arguments to be supplied to the command
A string representing the (possibly) incomplete command
A hash key-values where the keys are environment variables to be set
A hash of options. Keys with values of nil are considered flags
Public Class Methods
@param [String] command The program to call, either an absolute path
or one in the PATH (can be overridden)
@param [Array] args These are addition arguments to the command @param [Hash] options These are addition options to the command. They
will be added in "--key=value" after the command but before the arguments. There is a special key, 'ENV', that won't be used as a command option, but instead can be used to set any default environment variables
@example Recommended usage programmatically:
Command.new('git add', files, :patch => true, 'ENV' => {'PATH' => '/opt/csw/bin'})
@example My favorite example of a signature that we must maintain
Command.new('puppet', :resource, 'scheduled_task', name, [ 'ensure=present', 'command=c:\\\\windows\\\\system32\\\\notepad2.exe', "arguments=args-#{name}" ] )
@note For backwards compatability we must support any number of strings
or symbols (or arrays of strings an symbols) and essentially ensure they are in a flattened array, coerced to strings, and call #join(' ') on it. We have options for the command line invocation that must be turned into '--key=value' and similarly joined as well as a hash of environment key value pairs, and finally we need a hash of options to control the default envs that are included.
# File lib/beaker/command.rb, line 46 def initialize command, args = [], options = {} @command = command @options = options @args = args @environment = {} @cmdexe = @options.delete(:cmdexe) || false @prepend_cmds = @options.delete(:prepend_cmds) || nil @append_cmds = @options.delete(:append_cmds) || nil # this is deprecated and will not allow you to use a command line # option of `--environment`, please use ENV instead. [:ENV, :environment, 'environment', 'ENV'].each do |k| @environment = @environment.merge(@options.delete(k)) if @options[k].is_a?(Hash) end end
Public Instance Methods
@param [Array] args An array of arguments to the command.
@return [String] String of the arguments for command.
# File lib/beaker/command.rb, line 117 def args_string args = @args args.flatten.compact.join(' ') end
@param [Host] host An object that implements {Beaker::Host}‘s
interface.
@param [String] cmd An command to call. @param [Hash] env An optional hash of environment variables to be used @param [String] pc An optional list of commands to prepend
@return [String] This returns the fully formed command line invocation.
# File lib/beaker/command.rb, line 69 def cmd_line host, cmd = @command, env = @environment, pc = @prepend_cmds, ac = @append_cmds env_string = host.environment_string(env) prepend_commands = host.prepend_commands(cmd, pc, :cmd_exe => @cmdexe) append_commands = host.append_commands(cmd, ac, :cmd_exe => @cmdexe) # This will cause things like `puppet -t -v agent` which is maybe bad. cmd_line_array = [env_string, prepend_commands, cmd, options_string, args_string, append_commands] cmd_line_array.compact.reject(&:empty?).join(' ') end
@param [Hash] opts These are the options that the command takes
@return [String] String of the options and flags for command.
@note Why no. Not the least bit Unixy, why do you ask?
# File lib/beaker/command.rb, line 84 def options_string opts = @options flags = [] options = opts.dup options.each_key do |key| if options[key] == nil flags << key options.delete(key) end end short_flags, long_flags = flags.partition { |flag| flag.to_s.length == 1 } parsed_short_flags = short_flags.map { |f| "-#{f}" } parsed_long_flags = long_flags.map { |f| "--#{f}" } short_opts, long_opts = {}, {} options.each_key do |key| if key.to_s.length == 1 short_opts[key] = options[key] else long_opts[key] = options[key] end end parsed_short_opts = short_opts.map { |k, v| "-#{k}=#{v}" } parsed_long_opts = long_opts.map { |k, v| "--#{k}=#{v}" } return (parsed_short_flags + parsed_long_flags + parsed_short_opts + parsed_long_opts).join(' ') end