summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/puppet/application/help.rb7
-rw-r--r--lib/puppet/faces/help.rb52
-rw-r--r--spec/unit/faces/help_spec.rb44
3 files changed, 103 insertions, 0 deletions
diff --git a/lib/puppet/application/help.rb b/lib/puppet/application/help.rb
new file mode 100644
index 000000000..69905af27
--- /dev/null
+++ b/lib/puppet/application/help.rb
@@ -0,0 +1,7 @@
+require 'puppet/application/faces_base'
+
+class Puppet::Application::Help < Puppet::Application::FacesBase
+ def render(result)
+ puts result.join("\n")
+ end
+end
diff --git a/lib/puppet/faces/help.rb b/lib/puppet/faces/help.rb
new file mode 100644
index 000000000..e986d19b3
--- /dev/null
+++ b/lib/puppet/faces/help.rb
@@ -0,0 +1,52 @@
+require 'puppet/faces'
+
+Puppet::Faces.define(:help, '0.0.1') do
+ summary "Displays help about puppet subcommands"
+
+ action(:help) do
+ option "--version VERSION" do
+ desc "Which version of the interface to show help for"
+ end
+
+ when_invoked do |*args|
+ # Check our invocation, because we want varargs and can't do defaults
+ # yet. REVISIT: when we do option defaults, and positional options, we
+ # should rewrite this to use those. --daniel 2011-04-04
+ options = args.pop
+ if options.nil? or args.length > 2 then
+ raise ArgumentError, "help only takes two (optional) arguments, a face name, and an action"
+ end
+
+ if options[:version] and options[:version] !~ /^current$/i then
+ version = options[:version]
+ else
+ version = :current
+ end
+
+ message = []
+ if args.length == 0 then
+ message << "Use: puppet [options] <subcommand> <action>"
+ message << ""
+ message << "Available commands, from Puppet Faces:"
+ Puppet::Faces.faces.sort.each do |name|
+ face = Puppet::Faces[name, :current]
+ message << format(" %-15s %s", face.name, 'REVISIT: face.desc')
+ end
+ else
+ face = Puppet::Faces[args[0].to_sym, version]
+ if args[1] then
+ action = face.get_action args[1].to_sym
+ else
+ action = nil
+ end
+
+ help = []
+ face.actions.each do |action|
+ help << "Action: #{action}"
+ end
+ end
+
+ message
+ end
+ end
+end
diff --git a/spec/unit/faces/help_spec.rb b/spec/unit/faces/help_spec.rb
new file mode 100644
index 000000000..5b611a0ad
--- /dev/null
+++ b/spec/unit/faces/help_spec.rb
@@ -0,0 +1,44 @@
+require 'spec_helper'
+require 'puppet/faces/help'
+
+describe Puppet::Faces[:help, '0.0.1'] do
+ it "should have a help action" do
+ subject.should be_action :help
+ end
+
+ it "should have a default action of help" do
+ pending "REVISIT: we don't support default actions yet"
+ end
+
+ it "should accept a call with no arguments" do
+ expect { subject.help() }.should_not raise_error
+ end
+
+ it "should accept a face name" do
+ expect { subject.help(:help) }.should_not raise_error
+ end
+
+ it "should accept a face and action name" do
+ expect { subject.help(:help, :help) }.should_not raise_error
+ end
+
+ it "should fail if more than a face and action are given" do
+ expect { subject.help(:help, :help, :for_the_love_of_god) }.
+ should raise_error ArgumentError
+ end
+
+ it "should treat :current and 'current' identically" do
+ subject.help(:help, :current).should ==
+ subject.help(:help, 'current')
+ end
+
+ it "should complain when the request version of a face is missing" do
+ expect { subject.help(:huzzah, :bar, :version => '17.0.0') }.
+ should raise_error Puppet::Error
+ end
+
+ it "should find a face by version" do
+ face = Puppet::Faces[:huzzah, :current]
+ subject.help(:huzzah, face.version).should == subject.help(:huzzah, :current)
+ end
+end