class HammerCLI::AbstractCommand

Attributes

validation_blocks[RW]

Public Class Methods

build_options(builder_params={}) { |builder_params| ... } click to toggle source
# File lib/hammer_cli/abstract.rb, line 180
def self.build_options(builder_params={})
  builder_params = yield(builder_params) if block_given?

  option_builder.build(builder_params).each do |option|
    # skip switches that are already defined
    next if option.nil? or option.switches.any? {|s| find_option(s) }

    declared_options << option
    block ||= option.default_conversion_block
    define_accessors_for(option, &block)
    extend_options_help(option) if option.value_formatter.is_a?(HammerCLI::Options::Normalizers::ListNested)
  end
end
command_extensions() click to toggle source
# File lib/hammer_cli/abstract.rb, line 29
def command_extensions
  @command_extensions = @command_extensions || inherited_command_extensions || []
  @command_extensions
end
extend_help(&block) click to toggle source
# File lib/hammer_cli/abstract.rb, line 137
def self.extend_help(&block)
  # We save the block for execution on object level, where we can access command's context and check :is_tty? flag
  self.help_extension_blocks << block
end
extend_options_help(option) click to toggle source
# File lib/hammer_cli/abstract.rb, line 43
def extend_options_help(option)
  extend_help do |h|
    begin
      h.find_item(:s_option_details)
    rescue ArgumentError
      option_details = HammerCLI::Help::Section.new(_('Option details'), nil, id: :s_option_details, richtext: true)
      option_details.definition << HammerCLI::Help::Text.new(
        _('Following parameters accept format defined by its schema (bold are required):')
      )
      h.definition.unshift(option_details)
    ensure
      h.find_item(:s_option_details).definition << HammerCLI::Help::List.new([
        [option.switches.last, option.value_formatter.schema.description]
      ])
    end
  end
end
extend_output_definition(&block) click to toggle source
# File lib/hammer_cli/abstract.rb, line 142
def self.extend_output_definition(&block)
  block.call(output_definition)
rescue ArgumentError => e
  handler = HammerCLI::ExceptionHandler.new
  handler.handle_exception(e)
end
extend_with(*extensions) click to toggle source
# File lib/hammer_cli/abstract.rb, line 194
def self.extend_with(*extensions)
  extensions.each do |extension|
    unless extension.is_a?(HammerCLI::CommandExtensions)
      raise ArgumentError, _('Command extensions should be inherited from %s.') % HammerCLI::CommandExtensions
    end
    extension.delegatee(self)
    extension.extend_options(self)
    extension.extend_output(self)
    extension.extend_help(self)
    logger('Extensions').info "Applied #{extension.details} on #{self}."
    command_extensions << extension
  end
end
help(invocation_path, builder = HammerCLI::Help::Builder.new) click to toggle source
Calls superclass method
# File lib/hammer_cli/abstract.rb, line 119
def self.help(invocation_path, builder = HammerCLI::Help::Builder.new)
  super(invocation_path, builder)

  unless help_extension_blocks.empty?
    help_extension = HammerCLI::Help::TextBuilder.new(builder.richtext)
    help_extension_blocks.each do |extension_block|
      begin
        extension_block.call(help_extension)
      rescue ArgumentError => e
        handler = HammerCLI::ExceptionHandler.new
        handler.handle_exception(e)
      end
    end
    builder.add_text(help_extension.string)
  end
  builder.string
end
help_extension_blocks() click to toggle source
# File lib/hammer_cli/abstract.rb, line 25
def help_extension_blocks
  @help_extension_blocks ||= []
end
inherited_command_extensions() click to toggle source
# File lib/hammer_cli/abstract.rb, line 34
def inherited_command_extensions
  extensions = nil
  if superclass.respond_to?(:command_extensions)
    parent_extensions = superclass.command_extensions.select(&:inheritable?)
    extensions = parent_extensions.dup unless parent_extensions.empty?
  end
  extensions
end
new(*args) click to toggle source
Calls superclass method
# File lib/hammer_cli/abstract.rb, line 105
def initialize(*args)
  super
  context[:path] ||= []
  context[:path] << self
end
option_builder() click to toggle source
# File lib/hammer_cli/abstract.rb, line 175
def self.option_builder
  @option_builder ||= create_option_builder
  @option_builder
end
output(definition=nil, &block) click to toggle source
# File lib/hammer_cli/abstract.rb, line 149
def self.output(definition=nil, &block)
  dsl = HammerCLI::Output::Dsl.new
  dsl.build &block if block_given?
  output_definition.append definition.fields unless definition.nil?
  output_definition.append dsl.fields
end
output_definition() click to toggle source
# File lib/hammer_cli/abstract.rb, line 165
def self.output_definition
  @output_definition = @output_definition || inherited_output_definition || HammerCLI::Output::Definition.new
  @output_definition
end
validate_options(mode=:append, target_name=nil, validator: nil, &block) click to toggle source
# File lib/hammer_cli/abstract.rb, line 91
def self.validate_options(mode=:append, target_name=nil, validator: nil, &block)
  validator ||= HammerCLI::Options::Validators::DSLBlockValidator.new(&block)
  self.validation_blocks ||= []
  self.validation_blocks << [mode, target_name, validator]
end

Protected Class Methods

autoload_subcommands() click to toggle source
# File lib/hammer_cli/abstract.rb, line 282
def self.autoload_subcommands
  commands = constants.map { |c| const_get(c) }.select { |c| c <= HammerCLI::AbstractCommand }
  commands.each do |cls|
    subcommand(cls.command_name, cls.desc, cls, warning: cls.warning)
  end
end
command_name(name=nil) click to toggle source
# File lib/hammer_cli/abstract.rb, line 272
def self.command_name(name=nil)
  @name = name if name
  @name || (superclass.respond_to?(:command_name) ? superclass.command_name : nil)
end
create_option_builder() click to toggle source
# File lib/hammer_cli/abstract.rb, line 224
def self.create_option_builder
  OptionBuilderContainer.new
end
define_simple_writer_for(attribute, &block) click to toggle source
# File lib/hammer_cli/abstract.rb, line 289
def self.define_simple_writer_for(attribute, &block)
  define_method(attribute.write_method) do |value|
    value = instance_exec(value, &block) if block
    if attribute.respond_to?(:context_target) && attribute.context_target
      context[attribute.context_target] = value
    end
    attribute.of(self).set(value)
  end
end
desc(desc=nil) click to toggle source
# File lib/hammer_cli/abstract.rb, line 267
def self.desc(desc=nil)
  @desc = desc if desc
  @desc
end
find_options(switch_filter, other_filters={}) click to toggle source
# File lib/hammer_cli/abstract.rb, line 210
def self.find_options(switch_filter, other_filters={})
  filters = other_filters
  if switch_filter.is_a? Hash
    filters.merge!(switch_filter)
  else
    filters[:long_switch] = switch_filter
  end

  m = HammerCLI::Options::Matcher.new(filters)
  recognised_options.find_all do |opt|
    m.matches? opt
  end
end
logger(name=self) click to toggle source
# File lib/hammer_cli/abstract.rb, line 240
def self.logger(name=self)
  logger = Logging.logger[name]
  logger.extend(HammerCLI::Logger::Watch) if not logger.respond_to? :watch
  logger
end
option(switches, type, description, opts = {}, &block) click to toggle source
# File lib/hammer_cli/abstract.rb, line 299
def self.option(switches, type, description, opts = {}, &block)
  HammerCLI::Options::OptionDefinition.new(switches, type, description, opts).tap do |option|
    declared_options << option
    block ||= option.default_conversion_block
    define_accessors_for(option, &block)
  end
end
warning(message = nil) click to toggle source
# File lib/hammer_cli/abstract.rb, line 277
def self.warning(message = nil)
  @warning_msg = message if message
  @warning_msg
end

Private Class Methods

inherited_output_definition() click to toggle source
# File lib/hammer_cli/abstract.rb, line 343
def self.inherited_output_definition
  od = nil
  if superclass.respond_to? :output_definition
    od_super = superclass.output_definition
    od = od_super.dup unless od_super.nil?
  end
  od
end

Public Instance Methods

adapter() click to toggle source
# File lib/hammer_cli/abstract.rb, line 62
def adapter
  :base
end
exception_handler() click to toggle source
# File lib/hammer_cli/abstract.rb, line 101
def exception_handler
  @exception_handler ||= exception_handler_class.new(:output => output)
end
execute() click to toggle source
# File lib/hammer_cli/abstract.rb, line 87
def execute
  HammerCLI::EX_OK
end
help() click to toggle source
# File lib/hammer_cli/abstract.rb, line 115
def help
  self.class.help(invocation_path, HammerCLI::Help::Builder.new(context[:is_tty?]))
end
interactive?() click to toggle source
# File lib/hammer_cli/abstract.rb, line 171
def interactive?
  HammerCLI.interactive?
end
output() click to toggle source
# File lib/hammer_cli/abstract.rb, line 156
def output
  @output ||= HammerCLI::Output::Output.new(context, :default_adapter => adapter)
end
output_definition() click to toggle source
# File lib/hammer_cli/abstract.rb, line 160
def output_definition
  self.class.output_definition
end
parent_command() click to toggle source
# File lib/hammer_cli/abstract.rb, line 111
def parent_command
  context[:path][-2]
end
parse(arguments) click to toggle source
Calls superclass method
# File lib/hammer_cli/abstract.rb, line 79
def parse(arguments)
  super
  validate_options
  logger.info "Called with options: %s" % options.inspect
rescue HammerCLI::Options::Validators::ValidationError => e
  signal_usage_error e.message
end
run(arguments) click to toggle source
Calls superclass method
# File lib/hammer_cli/abstract.rb, line 66
def run(arguments)
  begin
    begin
      exit_code = super
      raise "exit code must be integer" unless exit_code.is_a? Integer
    rescue => e
      exit_code = handle_exception(e)
    end
    logger.debug 'Retrying the command' if (exit_code == HammerCLI::EX_RETRY)
  end while (exit_code == HammerCLI::EX_RETRY)
  return exit_code
end
validate_options() click to toggle source
# File lib/hammer_cli/abstract.rb, line 97
def validate_options
  # keep the method for legacy reasons
end

Protected Instance Methods

add_validators(sources) click to toggle source
# File lib/hammer_cli/abstract.rb, line 332
def add_validators(sources)
  if self.class.validation_blocks
    self.class.validation_blocks.each do |validation_block|
      sources.insert_relative(*validation_block)
    end
  end
  sources
end
all_options() click to toggle source
# File lib/hammer_cli/abstract.rb, line 307
def all_options
  option_collector.all_options
end
exception_handler_class() click to toggle source
# File lib/hammer_cli/abstract.rb, line 259
def exception_handler_class
  #search for exception handler class in parent modules/classes
  HammerCLI.constant_path(self.class.name.to_s).reverse.each do |mod|
    return mod.send(:exception_handler_class) if mod.respond_to? :exception_handler_class
  end
  return HammerCLI::ExceptionHandler
end
handle_exception(e) click to toggle source
# File lib/hammer_cli/abstract.rb, line 255
def handle_exception(e)
  exception_handler.handle_exception(e)
end
logger(name=self.class) click to toggle source
# File lib/hammer_cli/abstract.rb, line 246
def logger(name=self.class)
  self.class.logger(name)
end
option_collector() click to toggle source
# File lib/hammer_cli/abstract.rb, line 315
def option_collector
  @option_collector ||= HammerCLI::Options::OptionCollector.new(self.class.recognised_options, add_validators(option_sources))
end
option_sources() click to toggle source
# File lib/hammer_cli/abstract.rb, line 320
def option_sources
  sources = HammerCLI::Options::ProcessorList.new(name: 'DefaultInputs')
  sources << HammerCLI::Options::Sources::CommandLine.new(self)
  sources << HammerCLI::Options::Sources::SavedDefaults.new(context[:defaults], logger) if context[:use_defaults]

  sources = HammerCLI::Options::ProcessorList.new([sources])
  self.class.command_extensions.each do |extension|
    extension.extend_option_sources(sources, self)
  end
  sources
end
options() click to toggle source
# File lib/hammer_cli/abstract.rb, line 311
def options
  option_collector.options
end
print_collection(definition, collection) click to toggle source
print_message(msg, msg_params = {}, options = {}) click to toggle source
print_record(definition, record) click to toggle source
validator() click to toggle source
# File lib/hammer_cli/abstract.rb, line 250
def validator
  # keep the method for legacy reasons, it's used by validate_options
  @validator ||= HammerCLI::Options::Validators::DSL.new(self.class.recognised_options, all_options)
end