From 0726f56723b36df148ace0de7fcf47c04d981a78 Mon Sep 17 00:00:00 2001 From: Richard LeBer Date: Sat, 18 Jun 2011 16:24:46 -0400 Subject: [PATCH] Fix problem with help not including parent command names for subcommands See problem identified in github Issue 128. This patch has been submitted as Issue 137 --- lib/thor.rb | 5 +++++ lib/thor/group.rb | 4 ++++ lib/thor/task.rb | 3 +++ spec/task_spec.rb | 3 +++ 4 files changed, 15 insertions(+) diff --git a/lib/thor.rb b/lib/thor.rb index aaaeeb9c1..f33255279 100644 --- a/lib/thor.rb +++ b/lib/thor.rb @@ -199,9 +199,14 @@ def printable_tasks(all = true, subcommand = false) def subcommands @subcommands ||= from_superclass(:subcommands, []) end + + def parent_commands + @parent_commands ||= from_superclass(:parent_commands, []) + end def subcommand(subcommand, subcommand_class) self.subcommands << subcommand.to_s + subcommand_class.parent_commands << subcommand.to_s subcommand_class.subcommand_help subcommand define_method(subcommand) { |*args| invoke subcommand_class, args } end diff --git a/lib/thor/group.rb b/lib/thor/group.rb index 94ef57658..8014cbaf9 100644 --- a/lib/thor/group.rb +++ b/lib/thor/group.rb @@ -203,6 +203,10 @@ def printable_tasks(*) item << (desc ? "# #{desc.gsub(/\s+/m,' ')}" : "") [item] end + + def parent_commands + [] + end def handle_argument_error(task, error) #:nodoc: raise error, "#{task.name.inspect} was called incorrectly. Are you sure it has arity equals to 0?" diff --git a/lib/thor/task.rb b/lib/thor/task.rb index 6db3b6081..21ab8e34d 100644 --- a/lib/thor/task.rb +++ b/lib/thor/task.rb @@ -39,6 +39,9 @@ def formatted_usage(klass, namespace = true, subcommand = false) formatted ||= "" + # Add parent commands (for subcommands) + klass.parent_commands.each {|parent_command| formatted << parent_command + ' ' } + # Add usage with required arguments formatted << if klass && !klass.arguments.empty? usage.to_s.gsub(/^#{name}/) do |match| diff --git a/spec/task_spec.rb b/spec/task_spec.rb index 1c7ea7c7a..1165575d1 100644 --- a/spec/task_spec.rb +++ b/spec/task_spec.rb @@ -13,18 +13,21 @@ def task(options={}) it "includes namespace within usage" do Object.stub!(:namespace).and_return("foo") Object.stub!(:arguments).and_return([]) + Object.stub!(:parent_commands).and_return([]) task(:bar => :required).formatted_usage(Object).should == "foo:can_has --bar=BAR" end it "removes default from namespace" do Object.stub!(:namespace).and_return("default:foo") Object.stub!(:arguments).and_return([]) + Object.stub!(:parent_commands).and_return([]) task(:bar => :required).formatted_usage(Object).should == ":foo:can_has --bar=BAR" end it "injects arguments into usage" do Object.stub!(:namespace).and_return("foo") Object.stub!(:arguments).and_return([ Thor::Argument.new(:bar, nil, true, :string) ]) + Object.stub!(:parent_commands).and_return([]) task(:foo => :required).formatted_usage(Object).should == "foo:can_has BAR --foo=FOO" end end