module RHC::Helpers

Constants

DEFAULT_DELAY_THROTTLE
MAX_RETRIES
PREFIX
SSLVersion

Public Instance Methods

agree(*args, &block) click to toggle source

By default, agree should take a single character in interactive

# File lib/rhc/helpers.rb, line 248
def agree(*args, &block)
  #args.push(interactive?.presence) if args.length == 1
  block = lambda do |q| 
    q.validate = %r\A(?:y|yes|n|no)\Z/
  end unless block_given?
  super *args, &block
end
certificate_file(file) click to toggle source
# File lib/rhc/helpers.rb, line 203
def certificate_file(file)
  file && OpenSSL::X509::Certificate.new(IO.read(File.expand_path(file)))
rescue => e
  debug e
  raise OptionParser::InvalidOption.new(nil, "The certificate '#{file}' cannot be loaded: #{e.message} (#{e.class})")
end
client_from_options(opts) click to toggle source
# File lib/rhc/helpers.rb, line 186
def client_from_options(opts)
  RHC::Rest::Client.new({
      :url => openshift_rest_endpoint.to_s,
      :debug => options.debug,
      :timeout => options.timeout,
    }.merge!(ssl_options).merge!(opts))
end
color(item, *args) click to toggle source

OVERRIDE: Replaces default commander behavior

# File lib/rhc/helpers.rb, line 279
def color(item, *args)
  if item.is_a? Array
    item.map{ |i| $terminal.color(i, *args) }
  else
    $terminal.color(item, *args)
  end
end
confirm_action(question) click to toggle source
# File lib/rhc/helpers.rb, line 256
def confirm_action(question)
  return if options.confirm
  return if !options.noprompt && paragraph{ agree "#{question} (yes|no): " }
  raise RHC::ConfirmationError
end
date(s) click to toggle source
# File lib/rhc/helpers.rb, line 54
def date(s)
  now = Date.today
  d = datetime_rfc3339(s).to_time
  if now.year == d.year
    return d.strftime('%l:%M %p').strip if now.yday == d.yday
    d.strftime('%b %d %l:%M %p')
  else
    d.strftime('%b %d, %Y %l:%M %p')
  end
rescue ArgumentError
  "Unknown date"
end
datetime_rfc3339(s) click to toggle source
# File lib/rhc/helpers.rb, line 90
def datetime_rfc3339(s)
  DateTime.strptime(s, '%Y-%m-%dT%H:%M:%S%z')
  # Replace with d = DateTime.rfc3339(s)
end
debug(*args) click to toggle source
# File lib/rhc/helpers.rb, line 218
def debug(*args)
  $terminal.debug(*args)
end
debug?() click to toggle source
# File lib/rhc/helpers.rb, line 224
def debug?
  $terminal.debug?
end
debug_error(*args) click to toggle source
# File lib/rhc/helpers.rb, line 221
def debug_error(*args)
  $terminal.debug_error(*args)
end
decode_json(s) click to toggle source
# File lib/rhc/helpers.rb, line 32
def decode_json(s)
  RHC::Vendor::OkJson.decode(s)
end
deprecated(msg,short = false) click to toggle source
# File lib/rhc/helpers.rb, line 240
def deprecated(msg,short = false)
  raise DeprecatedError.new(msg % ['an error','a warning',0]) if disable_deprecated?
  warn "Warning: #{msg}\n" % ['a warning','an error',1]
end
deprecated_command(correct, short=false) click to toggle source
# File lib/rhc/helpers.rb, line 232
def deprecated_command(correct, short=false)
  deprecated("This command is deprecated. Please use '#{correct}' instead.", short)
end
deprecated_option(deprecated, other) click to toggle source
# File lib/rhc/helpers.rb, line 236
def deprecated_option(deprecated, other)
  deprecated("The option '#{deprecated}' is deprecated. Please use '#{other}' instead")
end
disable_deprecated?() click to toggle source
# File lib/rhc/helpers.rb, line 228
def disable_deprecated?
  ENV['DISABLE_DEPRECATED'] == '1'
end
distance_of_time_in_words(from_time, to_time = 0) click to toggle source
# File lib/rhc/helpers.rb, line 67
def distance_of_time_in_words(from_time, to_time = 0)
  from_time = from_time.to_time if from_time.respond_to?(:to_time)
  to_time = to_time.to_time if to_time.respond_to?(:to_time)
  distance_in_minutes = (((to_time - from_time).abs)/60).round
  distance_in_seconds = ((to_time - from_time).abs).round

  case distance_in_minutes
    when 0..1
      return distance_in_minutes == 0 ?
             "less than 1 minute" :
             "#{distance_in_minutes} minute"

    when 2..44           then "#{distance_in_minutes} minutes"
    when 45..89          then "about 1 hour"
    when 90..1439        then "about #{(distance_in_minutes.to_f / 60.0).round} hours"
    when 1440..2519      then "about 1 day"
    when 2520..43199     then "#{(distance_in_minutes.to_f / 1440.0).round} days"
    when 43200..86399    then "about 1 month"
    else
      "about #{(distance_in_minutes.to_f / 43200.0).round} months"
  end
end
error(msg, *args) click to toggle source
# File lib/rhc/helpers.rb, line 274
def error(msg, *args)
  say color(msg, :red), *args
end
host_exists?(host) click to toggle source

Check if host exists

# File lib/rhc/helpers.rb, line 370
def host_exists?(host)
  # :nocov:
  # Patch for BZ840938 to support Ruby 1.8 on machines without /etc/resolv.conf
  dns = Resolv::DNS.new((Resolv::DNS::Config.default_config_hash || {}))
  dns.getresources(host, Resolv::DNS::Resource::IN::A).any?
  # :nocov:
end
hosts_file_contains?(host) click to toggle source
# File lib/rhc/helpers.rb, line 378
def hosts_file_contains?(host)
  with_tolerant_encoding do
    begin
      resolver = Resolv::Hosts.new
      resolver.getaddress host
    rescue => e
      debug "Error while resolving with Resolv::Hosts: #{e.message}(#{e.class})\n  #{e.backtrace.join("\n  ")}"
    end
  end
end
human_size( s ) click to toggle source
# File lib/rhc/helpers.rb, line 43
def human_size( s )
  return "unknown" unless s
  s = s.to_f
  i = PREFIX.length - 1
  while s > 500 && i > 0
    i -= 1
    s /= 1000
  end
  ((s > 9 || s.modulo(1) < 0.1 ? '%d' : '%.1f') % s) + ' ' + PREFIX[i]
end
info(msg, *args) click to toggle source
# File lib/rhc/helpers.rb, line 266
def info(msg, *args)
  say color(msg, :cyan), *args
end
interactive?() click to toggle source

Output helpers

# File lib/rhc/helpers.rb, line 214
def interactive?
  $stdin.tty? and $stdout.tty? and not options.noprompt
end
jruby?() click to toggle source

Platform helpers

# File lib/rhc/helpers.rb, line 362
def jruby? ; RUBY_PLATFORM =~ %rjava/ end
mac?() click to toggle source
# File lib/rhc/helpers.rb, line 365
def mac? ; RbConfig::CONFIG['host_os'] =~ %r^darwin/ end
openshift_online_server?() click to toggle source
# File lib/rhc/helpers.rb, line 149
def openshift_online_server?
  openshift_server =~ %ropenshift.redhat.com$/
end
openshift_rest_endpoint() click to toggle source
# File lib/rhc/helpers.rb, line 176
def openshift_rest_endpoint
  uri = to_uri((options.server rescue nil) || ENV['LIBRA_SERVER'] || "openshift.redhat.com")
  uri.path = '/broker/rest/api' if uri.path.blank? || uri.path == '/'
  uri
end
openshift_server() click to toggle source
# File lib/rhc/helpers.rb, line 146
def openshift_server
  to_host((options.server rescue nil) || ENV['LIBRA_SERVER'] || "openshift.redhat.com")
end
openshift_url() click to toggle source
# File lib/rhc/helpers.rb, line 152
def openshift_url
  "https://#{openshift_server}"
end
pluralize(count, s) click to toggle source
# File lib/rhc/helpers.rb, line 293
def pluralize(count, s)
  count == 1 ? "#{count} #{s}" : "#{count} #{s}s"
end
results() { || ... } click to toggle source

results

highline helper which creates a paragraph with a header to distinguish the final results of a command from other output

# File lib/rhc/helpers.rb, line 354
def results(&block)
  section(:top => 1, :bottom => 0) do
    say "RESULT:"
    yield
  end
end
run_with_tee(cmd) click to toggle source

Run a command and export its output to the user. Output is not capturable on all platforms.

# File lib/rhc/helpers.rb, line 410
def run_with_tee(cmd)
  status, stdout, stderr = nil

  if windows?
    #:nocov: TODO: Test block
    system(cmd)
    status = $?.exitstatus
    #:nocov:
  else
    stdout, stderr = [$stdout, $stderr].map{ |t| StringTee.new(t) }
    status = Open4.spawn(cmd, 'stdout' => stdout, 'stderr' => stderr, 'quiet' => true)
    stdout, stderr = [stdout, stderr].map(&:string)
  end

  [status, stdout, stderr]
end
ssh_string(ssh_url) click to toggle source
# File lib/rhc/helpers.rb, line 167
def ssh_string(ssh_url)
  return nil if ssh_url.blank?
  uri = URI.parse(ssh_url)
  "#{uri.user}@#{uri.host}"
rescue => e
  RHC::Helpers.debug_error(e)
  ssh_url
end
ssl_options() click to toggle source
# File lib/rhc/helpers.rb, line 194
def ssl_options
  {
    :ssl_version => options.ssl_version,
    :client_cert => certificate_file(options.ssl_client_cert),
    :ca_file => options.ssl_ca_file && File.expand_path(options.ssl_ca_file),
    :verify_mode => options.insecure ? OpenSSL::SSL::VERIFY_NONE : nil,
  }.delete_if{ |k,v| v.nil? }
end
success(msg, *args) click to toggle source
# File lib/rhc/helpers.rb, line 262
def success(msg, *args)
  say color(msg, :green), *args
end
system_path(path) click to toggle source
# File lib/rhc/helpers.rb, line 36
def system_path(path)
  return path.gsub(File::SEPARATOR, File::ALT_SEPARATOR) if File.const_defined?('ALT_SEPARATOR') and File::ALT_SEPARATOR.present?
  path
end
table_heading(value) click to toggle source

This will format table headings for a consistent look and feel

If a heading isn't explicitly defined, it will attempt to look up the parts
If those aren't found, it will capitalize the string
# File lib/rhc/helpers.rb, line 300
def table_heading(value)
  # Set the default proc to look up undefined values
  headings = Hash.new do |hash,key|
    items = key.to_s.split('_')
    # Look up each piece individually
    hash[key] = items.length > 1 ?
      # Recusively look up the heading for the parts
      items.map{|x| headings[x.to_sym]}.join(' ') :
      # Capitalize if this part isn't defined
      items.first.capitalize
  end

  # Predefined headings (or parts of headings)
  headings.merge!({
    :creation_time  => "Created",
    :expires_in_seconds => "Expires In",
    :uuid           => "UUID",
    :current_scale  => "Current",
    :scales_from    => "Minimum",
    :scales_to      => "Maximum",
    :gear_sizes     => "Allowed Gear Sizes",
    :consumed_gears => "Gears Used",
    :max_gears      => "Gears Allowed",
    :gear_info      => "Gears",
    :plan_id        => "Plan",
    :url            => "URL",
    :ssh_string     => "SSH",
    :connection_info => "Connection URL",
    :gear_profile   => "Gear Size",
    :visible_to_ssh? => 'Available',
    :downloaded_cartridge_url => 'From',
  })

  headings[value]
end
to_host(s) click to toggle source
# File lib/rhc/helpers.rb, line 156
def to_host(s)
  s =~ %r(^http(?:s)?://) ? URI(s).host : s
end
to_uri(s) click to toggle source
# File lib/rhc/helpers.rb, line 159
def to_uri(s)
  begin
    URI(s =~ %r(^http(?:s)?://) ? s : "https://#{s}")
  rescue URI::InvalidURIError
    raise RHC::InvalidURIException.new(s)
  end
end
token_for_user() click to toggle source
# File lib/rhc/helpers.rb, line 182
def token_for_user
  options.token or (token_store.get(options.rhlogin, options.server) if options.rhlogin && options.use_authorization_tokens)
end
unix?() click to toggle source
# File lib/rhc/helpers.rb, line 364
def unix? ; !jruby? && !windows? end
user_agent() click to toggle source

Web related requests

# File lib/rhc/helpers.rb, line 99
def user_agent
  "rhc/#{RHC::VERSION::STRING} (ruby #{RUBY_VERSION}; #{RUBY_PLATFORM})#{" (API #{RHC::Rest::API_VERSION})" rescue ''}"
end
warn(msg, *args) click to toggle source
# File lib/rhc/helpers.rb, line 270
def warn(msg, *args)
  say color(msg, :yellow), *args
end
windows?() click to toggle source
# File lib/rhc/helpers.rb, line 363
def windows? ; RUBY_PLATFORM =~ %rwin(32|dows|ce)|djgpp|(ms|cyg|bcc)win|mingw32/ end
with_tolerant_encoding() { || ... } click to toggle source
# File lib/rhc/helpers.rb, line 389
def with_tolerant_encoding(&block)
  # :nocov:
  if RUBY_VERSION.to_f >= 1.9
    orig_default_internal = Encoding.default_internal
    Encoding.default_internal = 'ISO-8859-1'
  else
    orig_default_kcode = $KCODE
    $KCODE = 'N'
  end
  yield
ensure
  if RUBY_VERSION.to_f >= 1.9
    Encoding.default_internal = orig_default_internal
  else
    $KCODE = orig_default_kcode
  end
  # :nocov:
end