class TTY::Command::Cmd

Encapsulates the executed command

@api private

Attributes

argv[R]

A string arguments @api public

command[R]

A string command name, or shell program @api public

only_output_on_error[R]

Flag that controls whether to print the output only on error or not

options[R]

Hash of operations to peform @api public

uuid[R]

Unique identifier @api public

Public Class Methods

new(env_or_cmd, *args) click to toggle source

Initialize a new Cmd object

@api private

# File lib/tty/command/cmd.rb, line 34
def initialize(env_or_cmd, *args)
  opts = args.last.respond_to?(:to_hash) ? args.pop : {}
  if env_or_cmd.respond_to?(:to_hash)
    @env = env_or_cmd
    unless command = args.shift
      raise ArgumentError, "Cmd requires command argument"
    end
  else
    command = env_or_cmd
  end

  if args.empty? && cmd = command.to_s
    raise ArgumentError, "No command provided" if cmd.empty?

    @command = sanitize(cmd)
    @argv = []
  else
    if command.respond_to?(:to_ary)
      @command = sanitize(command[0])
      args.unshift(*command[1..-1])
    else
      @command = sanitize(command)
    end
    @argv = args.map { |i| Shellwords.escape(i) }
  end
  @env ||= {}
  @options = opts

  @uuid = SecureRandom.uuid.split("-")[0]
  @only_output_on_error = opts.fetch(:only_output_on_error) { false }
  freeze
end

Public Instance Methods

chdir(value) click to toggle source
# File lib/tty/command/cmd.rb, line 101
def chdir(value)
  return value unless options[:chdir]

  %(cd #{Shellwords.escape(options[:chdir])} && #{value})
end
environment() click to toggle source

The shell environment variables

@api public

# File lib/tty/command/cmd.rb, line 77
def environment
  @env.merge(options.fetch(:env, {}))
end
environment_string() click to toggle source
# File lib/tty/command/cmd.rb, line 81
def environment_string
  environment.map do |key, val|
    converted_key = key.is_a?(Symbol) ? key.to_s.upcase : key.to_s
    escaped_val = val.to_s.gsub(/"/, '\"')
    %(#{converted_key}="#{escaped_val}")
  end.join(" ")
end
evars(value, &block) click to toggle source
# File lib/tty/command/cmd.rb, line 89
def evars(value, &block)
  return (value || block) unless environment.any?

  "( export #{environment_string} ; #{value || block.call} )"
end
group(value) click to toggle source
# File lib/tty/command/cmd.rb, line 114
def group(value)
  return value unless options[:group]

  %(sg #{options[:group]} -c \\\"%s\\\") % [value]
end
to_command() click to toggle source

Assemble full command

@api public

# File lib/tty/command/cmd.rb, line 129
def to_command
  chdir(umask(evars(user(group(to_s)))))
end
to_hash() click to toggle source

@api public

# File lib/tty/command/cmd.rb, line 139
def to_hash
  {
    command: command,
    argv: argv,
    uuid: uuid
  }
end
to_s() click to toggle source

@api public

# File lib/tty/command/cmd.rb, line 134
def to_s
  [command.to_s, *Array(argv)].join(" ")
end
umask(value) click to toggle source
# File lib/tty/command/cmd.rb, line 95
def umask(value)
  return value unless options[:umask]

  %(umask #{options[:umask]} && %s) % [value]
end
update(options) click to toggle source

Extend command options if keys don't already exist

@api public

# File lib/tty/command/cmd.rb, line 70
def update(options)
  @options.update(options.merge(@options))
end
user(value) click to toggle source
# File lib/tty/command/cmd.rb, line 107
def user(value)
  return value unless options[:user]

  vars = environment.any? ? "#{environment_string} " : ""
  %(sudo -u #{options[:user]} #{vars}-- sh -c '%s') % [value]
end
with_clean_env() click to toggle source

Clear environment variables except specified by env

@api public

# File lib/tty/command/cmd.rb, line 123
def with_clean_env
end

Private Instance Methods

sanitize(value) click to toggle source

Coerce to string

@api private

# File lib/tty/command/cmd.rb, line 152
def sanitize(value)
  value.to_s.dup
end