class HammerCLIForeman::DependentSearchablesOptionBuilder

Attributes

resource[R]

Public Class Methods

new(resource, searchables, options = {}) click to toggle source
# File lib/hammer_cli_foreman/option_builders.rb, line 205
def initialize(resource, searchables, options = {})
  @resource = resource
  @searchables = searchables
  @context = options[:context] || {}
end

Public Instance Methods

build(builder_params={}) click to toggle source
# File lib/hammer_cli_foreman/option_builders.rb, line 213
def build(builder_params={})
  resource_name_map = builder_params[:resource_mapping] || {}
  command = builder_params[:command]
  dependent_options(@resource, resource_name_map, command)
end

Protected Instance Methods

aliased(name, resource_name_map) click to toggle source
# File lib/hammer_cli_foreman/option_builders.rb, line 284
def aliased(name, resource_name_map)
  resource_name_map[name.to_s] || resource_name_map[name.to_sym] || name
end
dependent_options(resource, resource_name_map, command) click to toggle source
# File lib/hammer_cli_foreman/option_builders.rb, line 221
def dependent_options(resource, resource_name_map, command)
  options = []
  searchables = @searchables.for(resource)
  resource_name = resource.singular_name
  aliased_name = aliased(resource_name, resource_name_map)
  types = searchables.map(&:name).push('id').map(&:capitalize).join('/')
  associated_resource = aliased_name.to_s.tr('_', ' ')
  family = command.option_families.find do |f|
    f.head.referenced_resource == resource_name
  end
  unless family
    # If there is no family it probably means that we explicitly want to
    # expand options via
    # build_options do |o|
    #   o.expand.including(:resource)
    # end
    # instead of generating it from API docs (it may not be even present there)
    family = HammerCLI::Options::OptionFamily.new(
      description: _('%{types} of associated %{resource}') % { types: types, resource: associated_resource },
      creator: command
    )
    options << family.parent(
      optionamize("--#{aliased_name}-id"),
      "#{aliased_name}_id".upcase,
      description("#{aliased_name}_id", @context[:action]),
      attribute_name: HammerCLI.option_accessor_name("#{resource_name}_id"),
      referenced_resource: resource_name,
      aliased_resource: aliased_name,
      format: HammerCLI::Options::Normalizers::Number.new
    )
  end

  unless searchables.empty?
    first = searchables[0]
    remaining = searchables[1..-1] || []

    # First option is named by the resource
    # Eg. --organization with accessor option_organization_name
    options << family.child(
      optionamize("--#{aliased_name}"),
      "#{aliased_name}_#{first.name}".upcase,
      first.description || ' ',
      attribute_name: HammerCLI.option_accessor_name("#{resource_name}_#{first.name}"),
      referenced_resource: resource_name,
      aliased_resource: aliased_name
    )
    # Other options are named by the resource plus the searchable name
    # Eg. --organization-label with accessor option_organization_label
    remaining.each do |s|
      options << family.child(
        optionamize("--#{aliased_name}-#{s.name}"),
        "#{aliased_name}_#{s.name}".upcase,
        s.description || ' ',
        attribute_name: HammerCLI.option_accessor_name("#{resource_name}_#{s.name}"),
        referenced_resource: resource_name,
        aliased_resource: aliased_name
      )
    end
  end

  options
end
description(param_name, action) click to toggle source
# File lib/hammer_cli_foreman/option_builders.rb, line 288
def description(param_name, action)
  return super('id', :show) if action.nil?

  param = ParamsNameFilter.new(param_name).for_action(action).first
  return ' ' if param.nil?

  param.description
end