class AwesomeSpawn::CommandLineBuilder
Constants
- KEY_REGEX
Public Instance Methods
build(command, params = nil)
click to toggle source
Build the full command line.
@param [String] command The command to run @param [Hash,Array] params Optional command line parameters. They can
be passed as a Hash or associative Array. The values are sanitized to prevent command line injection. Keys as Symbols are prefixed with `--`, and `_` is replaced with `-`. - `{:key => "value"}` generates `--key value` - `[[:key, "value"]]` generates `--key value` - `{:key= => "value"}` generates `--key=value` - `[[:key=, "value"]]` generates `--key=value` <br /><br /> - `{"--key" => "value"}` generates `--key value` - `[["--key", "value"]]` generates `--key value` - `{"--key=" => "value"}` generates `--key=value` - `[["--key=", "value"]]` generates `--key=value` <br /><br /> - `{:key_name => "value"}` generates `--key-name value` - `[[:key_name, "value"]]` generates `--key-name value` - `{:key_name= => "value"}` generates `--key-name=value` - `[[:key_name=, "value"]]` generates `--key-name=value` <br /><br /> - `{"-f" => ["file1", "file2"]}` generates `-f file1 file2` - `[["-f", "file1", "file2"]]` generates `-f file1 file2` <br /><br /> - `{:key => nil}` generates `--key` - `[[:key, nil]]` generates `--key` - `[[:key]]` generates `--key` <br /><br /> - `{nil => ["file1", "file2"]}` generates `file1 file2` - `[[nil, ["file1", "file2"]]]` generates `file1 file2` - `[[nil, "file1", "file2"]]` generates `file1 file2` - `[["file1", "file2"]]` generates `file1 file2`
@return [String] The full command line
# File lib/awesome_spawn/command_line_builder.rb, line 41 def build(command, params = nil) params = assemble_params(sanitize(params)) params.empty? ? command.to_s : "#{command} #{params}" end
Private Instance Methods
assemble_params(sanitized_params)
click to toggle source
# File lib/awesome_spawn/command_line_builder.rb, line 48 def assemble_params(sanitized_params) sanitized_params.collect do |group| joiner = group.first.to_s.end_with?("=") ? "" : " " group.compact.join(joiner) end.join(" ") end
convert_symbol_key(key)
click to toggle source
# File lib/awesome_spawn/command_line_builder.rb, line 94 def convert_symbol_key(key) "--#{key.to_s.tr("_", "-")}" end
sanitize(params)
click to toggle source
# File lib/awesome_spawn/command_line_builder.rb, line 55 def sanitize(params) return [] if params.nil? || params.empty? sanitize_associative_array(params.to_a) end
sanitize_associative_array(assoc_array)
click to toggle source
# File lib/awesome_spawn/command_line_builder.rb, line 60 def sanitize_associative_array(assoc_array) assoc_array.each.with_object([]) do |item, array| array.concat(sanitize_item(item)) end end
sanitize_item(item)
click to toggle source
# File lib/awesome_spawn/command_line_builder.rb, line 66 def sanitize_item(item) case item when Array then sanitize_key_values(item[0], item[1..-1]) when Hash then sanitize_associative_array(item.to_a) else sanitize_key_values(item, []) end end
sanitize_key(key)
click to toggle source
# File lib/awesome_spawn/command_line_builder.rb, line 80 def sanitize_key(key) return key if key.nil? key = convert_symbol_key(key) if key.kind_of?(Symbol) case key when String return key if key.empty? prefix, key, suffix = KEY_REGEX.match(key)[1..3] "#{prefix}#{sanitize_value(key)}#{suffix}" else sanitize_value(key) end end
sanitize_key_values(key, values)
click to toggle source
# File lib/awesome_spawn/command_line_builder.rb, line 74 def sanitize_key_values(key, values) [[sanitize_key(key), *sanitize_value(values)]] end
sanitize_value(value)
click to toggle source
# File lib/awesome_spawn/command_line_builder.rb, line 98 def sanitize_value(value) case value when Enumerable value.to_a.collect { |i| sanitize_value(i) }.compact when NilClass value else value.to_s.shellescape end end