lib/hammer_cli/subcommand.rb in hammer_cli-0.11.0 vs lib/hammer_cli/subcommand.rb in hammer_cli-0.12.0

- old
+ new

@@ -1,39 +1,61 @@ module HammerCLI module Subcommand - class LazyDefinition < Clamp::Subcommand::Definition + class Definition < Clamp::Subcommand::Definition - def initialize(names, description, subcommand_class_name, path) + def initialize(names, description, subcommand_class, options = {}) @names = Array(names) @description = description - @subcommand_class_name = subcommand_class_name - @path = path + @subcommand_class = subcommand_class + @hidden = options[:hidden] + @warning = options[:warning] + end + + def hidden? + @hidden + end + + def subcommand_class + warn(@warning) if @warning + @subcommand_class + end + + attr_reader :warning + end + + class LazyDefinition < Definition + + def initialize(names, description, subcommand_class_name, path, options = {}) + super(names, description, subcommand_class_name, options) @loaded = false + @path = path end def loaded? @loaded end def subcommand_class + warn(@warning) if @warning if !@loaded require @path @loaded = true - @constantized_class = @subcommand_class_name.constantize + @constantized_class = @subcommand_class.constantize end @constantized_class end - end def self.included(base) base.extend(ClassMethods) end + + module ClassMethods def remove_subcommand(name) self.recognised_subcommands.delete_if do |sc| if sc.is_called?(name) logger.info "subcommand #{name} (#{sc.subcommand_class}) was removed." @@ -42,41 +64,44 @@ false end end end - def subcommand!(name, description, subcommand_class = self, &block) + def subcommand!(name, description, subcommand_class = self, options = {}, &block) remove_subcommand(name) - subcommand(name, description, subcommand_class, &block) + subcommand(name, description, subcommand_class, options, &block) logger.info "subcommand #{name} (#{subcommand_class}) was created." end - def subcommand(name, description, subcommand_class = self, &block) + def subcommand(name, description, subcommand_class = self, options = {}, &block) + definition = Definition.new(name, description, subcommand_class, options) + define_subcommand(name, subcommand_class, definition, &block) + end + + def lazy_subcommand(name, description, subcommand_class_name, path, options = {}) + definition = LazyDefinition.new(name, description, subcommand_class_name, path, options) + define_subcommand(name, Class, definition) + end + + def lazy_subcommand!(name, description, subcommand_class_name, path, options = {}) + remove_subcommand(name) + self.lazy_subcommand(name, description, subcommand_class_name, path, options) + logger.info "subcommand #{name} (#{subcommand_class_name}) was created." + end + + def define_subcommand(name, subcommand_class, definition, &block) existing = find_subcommand(name) if existing - raise HammerCLI::CommandConflict, _("can't replace subcommand %<name>s (%<existing_class>s) with %<name>s (%<new_class>s)") % { + raise HammerCLI::CommandConflict, _("Can't replace subcommand %<name>s (%<existing_class>s) with %<name>s (%<new_class>s).") % { :name => name, :existing_class => existing.subcommand_class, :new_class => subcommand_class } end - super + subcommand_class = Class.new(subcommand_class, &block) if block + declare_subcommand_parameters unless has_subcommands? + recognised_subcommands << definition end - - def lazy_subcommand(name, description, subcommand_class, path) - # call original subcommand to ensure command's parameters are set correctly - # (hammer command SUBCOMMAND [ARGS] ...) - subcommand(name, description, Class) - # replace last subcommand definition with correct lazy-loaded one - recognised_subcommands[-1] = LazyDefinition.new(name, description, subcommand_class, path) - end - - def lazy_subcommand!(name, description, subcommand_class, path) - remove_subcommand(name) - self.lazy_subcommand(name, description, subcommand_class, path) - logger.info "subcommand #{name} (#{subcommand_class}) was created." - end - end end end