对于cli项目,我希望有一个与thor任务共享的超类。当调用“帮助”子命令时,它应该使用自定义描述公开共享命令。
我想出了下面的代码,但是变量@复数在描述中没有被替换。
这是可能的托尔和一些元编程吗?
module MyModule
class ResourceSubcommand < Thor
def initialize(*args)
super
end
desc "list", "list all #{@plural}"
def list
list_object(@default_list_columns)
end
end
end
module MyModule
class Account < MyModule::ResourceSubcommand
def initialize(*args)
super
@plural = 'accounts'
end
end
end
module MyModule
class Commands < Thor
desc "account SUBCOMMAND ...ARGS", "manage Exact Online accounts"
subcommand "account", Account
end
end运行$ thorcli account help应该输出:
Commands:
thorcli account help [COMMAND] # Describe subcommands or one specific subcommand
thorcli account list # list all accounts发布于 2015-11-24 15:58:56
传递给desc的字符串是在类的上下文中计算的,但是initialize方法是在实例的上下文中计算的,因此两个@plural属于两个不同的对象。
此外,在定义超类desc时会立即调用MyModule::ResourceSubcommand,并且在继承超类并设置子类中的@plural之后,没有一种简单的方法来推迟它的评估,您的目标似乎很难实现。
我尝试过重写MyModule::ResourceSubcommand::inherited和MyModule::ResourceSubcommand.singleton_class::inherited,但是失败了。也许您可以将MyModule::ResourceSubcommand定义为一个模块,重写它的self.included,并在设置@plural之后在子类中包含它。
更新
我终于成功了。这是我的解决方案:
module MyModule
# Change from class to module
module ResourceSubcommand
# A hook called when this module is included by other modules
def self.included(base)
base.class_eval do
desc "list", "list all #{@plural}"
def list
list_object(@default_list_columns)
end
end
end
end
end
module MyModule
# No inheritance
class Account
# Don't put this in any instance methods, including #initialize
@plural = 'accounts'
# Be sure to include after @plural is set
include ResourceSubcommand
end
endhttps://stackoverflow.com/questions/33897536
复制相似问题