class HammerCLI::Apipie::OptionBuilder

Attributes

require_options[W]

Public Class Methods

new(resource, action, options={}) click to toggle source
# File lib/hammer_cli/apipie/option_builder.rb, line 6
def initialize(resource, action, options={})
  @action = action
  @resource = resource
  @require_options = options[:require_options].nil? ? true : options[:require_options]
end

Public Instance Methods

build(builder_params = {}) click to toggle source
# File lib/hammer_cli/apipie/option_builder.rb, line 12
def build(builder_params = {})
  filter = Array(builder_params[:without])
  resource_name_map = builder_params[:resource_mapping] || {}

  options_for_params(@action.params, filter, resource_name_map, command: builder_params[:command])
end
require_options?() click to toggle source
# File lib/hammer_cli/apipie/option_builder.rb, line 20
def require_options?
  @require_options
end

Protected Instance Methods

aliased(param, resource_name_map) click to toggle source
# File lib/hammer_cli/apipie/option_builder.rb, line 98
def aliased(param, resource_name_map)
  resource_name = resource_name(param)
  return param.name if resource_name.nil?

  param.name.gsub(resource_name, aliased_name(resource_name, resource_name_map).to_s)
end
aliased_name(name, resource_name_map) click to toggle source
# File lib/hammer_cli/apipie/option_builder.rb, line 92
def aliased_name(name, resource_name_map)
  return if name.nil?

  resource_name_map[name.to_s] || resource_name_map[name.to_sym] || name
end
create_option(param, resource_name_map, opts = {}) click to toggle source
# File lib/hammer_cli/apipie/option_builder.rb, line 45
def create_option(param, resource_name_map, opts = {})
  family = HammerCLI::Options::OptionFamily.new(creator: opts[:command])
  # APIdoc params are considered to be the main options (parent) by default
  family.parent(option_switch(param, resource_name_map),
                option_type(param, resource_name_map),
                option_desc(param),
                option_opts(param, resource_name_map))
end
option(*args) click to toggle source
# File lib/hammer_cli/apipie/option_builder.rb, line 26
def option(*args)
  HammerCLI::Apipie::OptionDefinition.new(*args)
end
option_desc(param) click to toggle source
# File lib/hammer_cli/apipie/option_builder.rb, line 62
def option_desc(param)
  param.description || " "
end
option_opts(param, resource_name_map) click to toggle source
# File lib/hammer_cli/apipie/option_builder.rb, line 66
def option_opts(param, resource_name_map)
  opts = {}
  opts[:required] = true if (param.required? and require_options?)
  if param.expected_type.to_s == 'array'
    if param.params.empty?
      opts[:format] = HammerCLI::Options::Normalizers::List.new
    else
      opts[:format] = HammerCLI::Options::Normalizers::ListNested.new(param.params)
    end
  elsif param.expected_type.to_s == 'boolean' || param.validator.to_s == 'boolean'
    opts[:format] = HammerCLI::Options::Normalizers::Bool.new
  elsif param.expected_type.to_s == 'string' && param.validator =~ /Must be one of: (.*)\./
    allowed = $1.split(/,\ ?/).map { |val| val.gsub(/<[^>]*>/i, '') }.map do |item|
      CGI.unescapeHTML(item)
    end
    opts[:format] = HammerCLI::Options::Normalizers::Enum.new(allowed)
  elsif param.expected_type.to_s == 'numeric'
    opts[:format] = HammerCLI::Options::Normalizers::Number.new
  end
  opts[:attribute_name] = HammerCLI.option_accessor_name(param.name)
  opts[:referenced_resource] = resource_name(param)
  opts[:aliased_resource] = aliased_name(resource_name(param), resource_name_map)

  return opts
end
option_switch(param, resource_name_map) click to toggle source
# File lib/hammer_cli/apipie/option_builder.rb, line 54
def option_switch(param, resource_name_map)
  '--' + optionamize(aliased(param, resource_name_map))
end
option_type(param, resource_name_map) click to toggle source
# File lib/hammer_cli/apipie/option_builder.rb, line 58
def option_type(param, resource_name_map)
  aliased(param, resource_name_map).upcase.gsub('-', '_')
end
options_for_params(params, filter, resource_name_map, opts = {}) click to toggle source
# File lib/hammer_cli/apipie/option_builder.rb, line 30
def options_for_params(params, filter, resource_name_map, opts = {})
  options = []
  params.each do |p|
    exists = opts[:command].find_option(option_switch(p, resource_name_map))
    next if filter.include?(p.name) || filter.include?(p.name.to_sym) || exists

    if p.expected_type == :hash
      options += options_for_params(p.params, filter, resource_name_map, opts)
    else
      options << create_option(p, resource_name_map, opts)
    end
  end
  options
end
resource_name(param) click to toggle source
# File lib/hammer_cli/apipie/option_builder.rb, line 105
def resource_name(param)
  if (param.name =~ /^id[s]?$/)
    @resource.singular_name
  elsif(param.name =~ /_id[s]?$/)
    param.name.to_s.gsub(/_id[s]?$/, "")
  else
    nil
  end
end