class SimpleArgsDispatch::Agent

Public Class Methods

new(speaker = nil, env_variables = {}) click to toggle source

Actions will be in the following format:

{
    :help => ['Dispatcher', 'show_available'],
    :reconfigure => ['App', 'reconfigure'],
    :some_name => {
        :some_function => ['SomeName', 'SomeFunction'],
        .....
}

end

# File lib/simple_args_dispatch.rb, line 18
def initialize(speaker = nil, env_variables = {})
  @speaker = speaker
  @env_variables = env_variables
end

Public Instance Methods

dispatch(app_name, args, actions, parent = nil, template_dir = '') click to toggle source
# File lib/simple_args_dispatch.rb, line 23
    def dispatch(app_name, args, actions, parent = nil, template_dir = '')
      arg = args.shift
      actions.each do |k, v|
        if arg == k.to_s
          if v.is_a?(Hash)
            self.dispatch(app_name, args, v, "#{parent} #{arg}", template_dir)
          else
            self.launch(app_name, v, args, "#{parent} #{arg}", template_dir)
          end
          return
        end
      end
      @speaker.speak_up('Unknown command/option

')
      self.show_available(app_name, actions, parent)
    end
launch(app_name, action, args, parent, template_dir) click to toggle source
# File lib/simple_args_dispatch.rb, line 41
def launch(app_name, action, args, parent, template_dir)
  args = Hash[args.flat_map { |s| s.scan(/--?([^=\s]+)(?:=(.+))?/) }]
  template_args = parse_template_args(load_template(args['template_name'], template_dir), template_dir)
  model = Object.const_get(action[0])
  req_params = model.method(action[1].to_sym).parameters.map { |a| a.reverse! }
  req_params.each do |param|
    return self.show_available(app_name, Hash[req_params.map { |k| ["--#{k[0]}=<#{k[0]}>", k[1]] }], parent, ' ', new_line, "Missing parameter: '#{param[0]}'") if param[1] == :keyreq && args[param[0].to_s].nil? && template_args[param[0].to_s].nil?
  end
  set_env_variables(@env_variables, args, template_args)
  dameth = model.method(action[1])
  params = Hash[req_params.map do |k, _|
    val = args[k.to_s] || template_args[k.to_s]
    val = YAML.load(val.gsub('=>', ': ')) if val.is_a?(String) && val.match(/^[{\[].*[}\]]$/)
    [k, val]
  end].select { |_, v| !v.nil? }
  if Thread.current[:debug].to_i > 0
    @speaker.speak_up("Running with arguments: #{params}", 0)
  end
  params.empty? ? dameth.call : dameth.call(params)
end
load_template(template_name, template_dir) click to toggle source
# File lib/simple_args_dispatch.rb, line 62
def load_template(template_name, template_dir)
  if template_name.to_s != '' && File.exist?(template_dir + '/' + "#{template_name}.yml")
    return YAML.load_file(template_dir + '/' + "#{template_name}.yml")
  end
  {}
rescue
  {}
end
new_line() click to toggle source
# File lib/simple_args_dispatch.rb, line 71
def new_line
  '---------------------------------------------------------'
end
parse_template_args(template, template_dir) click to toggle source
# File lib/simple_args_dispatch.rb, line 75
def parse_template_args(template, template_dir)
  template.keys.each do |k|
    if k.to_s == 'load_template'
      template[k] = [template[k]] if template[k].is_a?(String)
      template[k].each do |t|
        template.merge!(parse_template_args(load_template(t.to_s, template_dir), template_dir))
      end
      template.delete(k)
    elsif template[k].is_a?(Hash)
      template[k] = parse_template_args(template[k], template_dir)
    end
  end
  template
end
set_env_variables(env_flags, args, template_args = {}) click to toggle source
# File lib/simple_args_dispatch.rb, line 90
def set_env_variables(env_flags, args, template_args = {})
  env_flags.each do |k, _|
    Thread.current[k] = (args[k.to_s] || template_args[k.to_s]).to_i if args[k.to_s] || template_args[k.to_s]
  end
end
show_available(app_name, available, prepend = nil, join='|', separator = new_line, extra_info = '') click to toggle source
# File lib/simple_args_dispatch.rb, line 96
def show_available(app_name, available, prepend = nil, join='|', separator = new_line, extra_info = '')
  @speaker.speak_up("Usage: #{app_name} #{prepend + ' ' if prepend}#{available.map { |k, v| "#{'[' if v == :key}#{k.to_s}#{']' if v == :key}" }.join(join)}")
  if extra_info.to_s != ''
    @speaker.speak_up(separator)
    @speaker.speak_up(extra_info)
  end
end