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