class SchemaEvolutionManager::Args

Container for common args, mainly to have stricter validation on inputs. Tried to use GetoptLong but could not write solid unit tests around it… so we have our own internal simple implementation.

Constants

ARRAY_FLAGS
FLAGS_NO_ARGUMENTS
FLAGS_WITH_ARGUMENTS

Attributes

artifact_name[R]
dir[R]
dry_run[R]
host[R]
name[R]
non_interactive[R]
password[R]
port[R]
prefix[R]
set[R]
tag[R]
url[R]
user[R]

Public Class Methods

from_stdin(opts) click to toggle source

Hack to minimize bleeding from STDIN. Returns an instance of Args class

# File lib/schema-evolution-manager/args.rb, line 92
def Args.from_stdin(opts)
  values = ARGV.join(" ")
  Args.new(values, opts)
end
new(args, opts={}) click to toggle source

args: Actual string arguments :required => list of parameters that are required :optional => list of parameters that are optional

# File lib/schema-evolution-manager/args.rb, line 38
def initialize(args, opts={})
  Preconditions.assert_class_or_nil(args, String)
  required = (opts.delete(:required) || []).map { |flag| format_flag(flag) }
  optional = (opts.delete(:optional) || []).map { |flag| format_flag(flag) }
  Preconditions.assert_class(required, Array)
  Preconditions.assert_class(optional, Array)
  Preconditions.assert_empty_opts(opts)
  Preconditions.check_state(optional.size + required.size > 0,
                            "Must have at least 1 optional or required parameter")

  if !optional.include?(:help)
    optional << :help
  end
  if !optional.include?(:verbose)
    optional << :verbose
  end

  found_arguments = parse_string_arguments(args)
  missing = required.select { |field| blank?(found_arguments[field]) }

  @artifact_name = found_arguments.delete(:artifact_name)
  @host = found_arguments.delete(:host)
  @port = found_arguments.delete(:port)
  @name = found_arguments.delete(:name)
  @prefix = found_arguments.delete(:prefix)
  @url = found_arguments.delete(:url)
  @user = found_arguments.delete(:user)
  @dir = found_arguments.delete(:dir)
  @tag = found_arguments.delete(:tag)
  @set = found_arguments.delete(:set) || []

  @dry_run = found_arguments.delete(:dry_run)
  @non_interactice = found_arguments.delete(:non_interactive)
  @password = found_arguments.delete(:password)
  @help = found_arguments.delete(:help)
  @verbose = found_arguments.delete(:verbose)

  Preconditions.check_state(found_arguments.empty?,
                            "Did not handle all flags: %s" % found_arguments.keys.join(" "))

  if @help
    RdocUsage.printAndExit(0)
  end

  if @verbose
    Library.set_verbose(true)
  end

  if !missing.empty?
    missing_fields_error(required, optional, missing)
  end
end

Private Instance Methods

blank?(value) click to toggle source
# File lib/schema-evolution-manager/args.rb, line 98
def blank?(value)
  value.to_s.strip == ""
end
format_flag(flag) click to toggle source

Strip leading dashes and convert to symbol

# File lib/schema-evolution-manager/args.rb, line 165
def format_flag(flag)
  Preconditions.assert_class(flag, String)
  flag.sub(/^\-\-/, '').to_sym
end
help_parameters(title, parameters) click to toggle source
# File lib/schema-evolution-manager/args.rb, line 117
def help_parameters(title, parameters)
  docs = []
  if !parameters.empty?
    docs << ""
    docs << title
    docs << "-------------------"
    parameters.each do |flag|
      documentation = FLAGS_WITH_ARGUMENTS[flag] || FLAGS_NO_ARGUMENTS[flag]
      Preconditions.check_not_null(documentation, "No documentation found for flag[%s]" % flag)
      docs << "  --#{flag}"
      docs <<  "    " + documentation
      docs <<  ""
    end
  end
  docs.join("\n")
end
missing_fields_error(required, optional, fields) click to toggle source
# File lib/schema-evolution-manager/args.rb, line 102
def missing_fields_error(required, optional, fields)
  Preconditions.assert_class(fields, Array)
  Preconditions.check_state(!fields.empty?, "Missing fields cannot be empty")

  title = fields.size == 1 ? "Missing parameter" : "Missing parameters"
  sorted = fields.sort_by { |f| f.to_s }

  puts "**************************************************"
  puts "ERROR: #{title}: #{sorted.join(", ")}"
  puts "**************************************************"
  puts help_parameters("Required parameters", required)
  puts help_parameters("Optional parameters", optional)
  exit(1)
end
parse_string_arguments(args) click to toggle source
# File lib/schema-evolution-manager/args.rb, line 135
def parse_string_arguments(args)
  Preconditions.assert_class_or_nil(args, String)
  found = {}
  index = 0
  values = args.to_s.strip.split(/\s+/)
  while index < values.length do
    flag = format_flag(values[index])
    index += 1

    if FLAGS_WITH_ARGUMENTS.has_key?(flag)
      if ARRAY_FLAGS.include?(flag)
        found[flag] ||= []
        found[flag] << values[index]
      else
        found[flag] = values[index]
      end
      index += 1

    elsif FLAGS_NO_ARGUMENTS.has_key?(flag)
      found[flag] = true

    else
      raise "Unknown flag[%s]" % flag
    end

  end
  found
end