diff options
Diffstat (limited to 'lib/puppet/application/string_base.rb')
-rw-r--r-- | lib/puppet/application/string_base.rb | 90 |
1 files changed, 49 insertions, 41 deletions
diff --git a/lib/puppet/application/string_base.rb b/lib/puppet/application/string_base.rb index ffd49e8c0..1169a45a4 100644 --- a/lib/puppet/application/string_base.rb +++ b/lib/puppet/application/string_base.rb @@ -5,14 +5,6 @@ class Puppet::Application::StringBase < Puppet::Application should_parse_config run_mode :agent - def preinit - super - trap(:INT) do - $stderr.puts "Cancelling String" - exit(0) - end - end - option("--debug", "-d") do |arg| Puppet::Util::Log.level = :debug end @@ -32,7 +24,7 @@ class Puppet::Application::StringBase < Puppet::Application end - attr_accessor :string, :type, :verb, :arguments, :format + attr_accessor :string, :action, :type, :arguments, :format attr_writer :exit_code # This allows you to set the exit code if you don't want to just exit @@ -41,14 +33,6 @@ class Puppet::Application::StringBase < Puppet::Application @exit_code || 0 end - def main - # Call the method associated with the provided action (e.g., 'find'). - if result = string.send(verb, *arguments) - puts render(result) - end - exit(exit_code) - end - # Override this if you need custom rendering. def render(result) render_method = Puppet::Network::FormatHandler.format(format).render_method @@ -61,16 +45,14 @@ class Puppet::Application::StringBase < Puppet::Application end def preinit + super + trap(:INT) do + $stderr.puts "Cancelling String" + exit(0) + end + # We need to parse enough of the command line out early, to identify what # the action is, so that we can obtain the full set of options to parse. - # - # This requires a partial parse first, and removing the options that we - # understood, then identification of the next item, then another round of - # the same until we have the string and action all set. --daniel 2011-03-29 - # - # NOTE: We can't use the Puppet::Application implementation of option - # parsing because it is (*ahem*) going to puts on $stderr and exit when it - # hits a parse problem, not actually let us reuse stuff. --daniel 2011-03-29 # TODO: These should be configurable versions, through a global # '--version' option, but we don't implement that yet... --daniel 2011-03-29 @@ -78,19 +60,42 @@ class Puppet::Application::StringBase < Puppet::Application @string = Puppet::String[@type, :current] @format = @string.default_format - # Now, collect the global and string options and parse the command line. - begin - @string.options.inject OptionParser.new do |options, option| - option = @string.get_option option # turn it into the object, bleh - options.on(*option.to_optparse) do |value| - puts "REVISIT: do something with #{value.inspect}" + # Now, walk the command line and identify the action. We skip over + # arguments based on introspecting the action and all, and find the first + # non-option word to use as the action. + action = nil + cli = command_line.args.dup # we destroy this copy, but... + while @action.nil? and not cli.empty? do + item = cli.shift + if item =~ /^-/ then + option = @string.options.find { |a| item =~ /^-+#{a}\b/ } + if option then + if @string.get_option(option).takes_argument? then + # We don't validate if the argument is optional or mandatory, + # because it doesn't matter here. We just assume that errors will + # be caught later. --daniel 2011-03-30 + cli.shift unless cli.first =~ /^-/ + end + else + raise ArgumentError, "Unknown option #{item.sub(/=.*$/, '').inspect}" end - end.parse! command_line.args.dup - rescue OptionParser::InvalidOption => e - puts e.inspect # ...and ignore?? + else + action = @string.get_action(item.to_sym) + if action.nil? then + raise ArgumentError, "#{@string} does not have an #{item.inspect} action!" + end + @action = action + end end - fail "REVISIT: Finish this code, eh..." + @action or raise ArgumentError, "No action given on the command line!" + + # Finally, we can interact with the default option code to build behaviour + # around the full set of options we now know we support. + @action.options.each do |option| + option = @action.get_option(option) # make it the object. + self.class.option(*option.optparse) # ...and make the CLI parse it. + end end def setup @@ -100,18 +105,21 @@ class Puppet::Application::StringBase < Puppet::Application # action to read in the options. This replaces the older model where we # would invoke the action with options set as global state in the # interface object. --daniel 2011-03-28 - @verb = command_line.args.shift @arguments = Array(command_line.args) << options validate end + + def main + # Call the method associated with the provided action (e.g., 'find'). + if result = @string.send(@action.name, *arguments) + puts render(result) + end + exit(exit_code) + end def validate - unless verb + unless @action raise "You must specify #{string.actions.join(", ")} as a verb; 'save' probably does not work right now" end - - unless string.action?(verb) - raise "Command '#{verb}' not found for #{type}" - end end end |