[PATCH] BZ# 768507: aeolus-cli needs syntax to be more flexible

Jason Guiditta jguiditt at redhat.com
Mon Dec 19 18:00:31 UTC 2011


https://bugzilla.redhat.com/show_bug.cgi?id=768507

Refactor cli usage to always require a command.
---
 bin/aeolus-cli                          |    4 +-
 lib/aeolus_cli.rb                       |    1 +
 lib/aeolus_cli/command/cli_parser.rb    |   72 +++++++++++++++++++++++++++++++
 lib/aeolus_cli/command/config_parser.rb |    6 +-
 spec/command/cli_parser.rb              |   50 +++++++++++++++++++++
 spec/spec_helper.rb                     |   18 +-------
 6 files changed, 129 insertions(+), 22 deletions(-)
 create mode 100644 lib/aeolus_cli/command/cli_parser.rb
 create mode 100644 spec/command/cli_parser.rb

diff --git a/bin/aeolus-cli b/bin/aeolus-cli
index f3af29b..9f9a1aa 100755
--- a/bin/aeolus-cli
+++ b/bin/aeolus-cli
@@ -16,5 +16,5 @@
 
 $: << File.expand_path(File.dirname(__FILE__) + '/../lib')
 require 'aeolus_cli'
-parser = Aeolus::CLI::ConfigParser.new(ARGV)
-puts parser.process
+parser = Aeolus::CLI::CLIParser.new(ARGV)
+parser.process
diff --git a/lib/aeolus_cli.rb b/lib/aeolus_cli.rb
index a5a6bce..851d8da 100644
--- a/lib/aeolus_cli.rb
+++ b/lib/aeolus_cli.rb
@@ -22,6 +22,7 @@ require File.join(File.dirname(__FILE__), 'aeolus_cli/command', 'import_command'
 require File.join(File.dirname(__FILE__), 'aeolus_cli/command', 'delete_command')
 require File.join(File.dirname(__FILE__), 'aeolus_cli/command', 'status_command')
 require File.join(File.dirname(__FILE__), 'aeolus_cli/command', 'config_parser')
+require File.join(File.dirname(__FILE__), 'aeolus_cli/command', 'cli_parser')
 
 require File.join(File.dirname(__FILE__), 'aeolus_cli/model', 'base')
 require File.join(File.dirname(__FILE__), 'aeolus_cli/model', 'image')
diff --git a/lib/aeolus_cli/command/cli_parser.rb b/lib/aeolus_cli/command/cli_parser.rb
new file mode 100644
index 0000000..2aedef0
--- /dev/null
+++ b/lib/aeolus_cli/command/cli_parser.rb
@@ -0,0 +1,72 @@
+#   Copyright 2011 Red Hat, Inc.
+#
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+
+require 'optparse'
+
+module Aeolus
+  module CLI
+    class CLIParser
+      COMMANDS = %w(image)
+      attr_accessor :options, :command, :args
+
+      def initialize(argv=[], out=STDOUT )
+        @args = argv
+        @out = out
+        @options = {}
+      end
+
+      def process
+        # Check for command, then call appropriate Optionparser and initiate
+        # call to that class.
+        @command = @args.shift
+        if COMMANDS.include?(@command)
+          parse() unless @args.include?('-h')
+          self.send(@command.to_sym)
+        else
+          @args << "-h" unless @args.include?('-h')
+          parse()
+        end
+      end
+
+      private
+      def parse()
+        @optparse ||= OptionParser.new do|opts|
+          opts.banner = "Usage: aeolus-cli [#{COMMANDS.join('|')}] [subcommand] [general options] [command options]"
+          opts.separator ""
+          opts.on( '-h', '--help', 'Get usage information for this tool') do
+            @out.puts opts
+          end
+          opts.separator ""
+          opts.separator "URL with credentials to Conductor are set in ~/.aeolus-cli"
+          opts.separator "Conductor URL should point to https://<host_where_conductor_runs>/conductor/api"
+        end
+
+        begin
+          @optparse.parse(@args)
+        rescue OptionParser::InvalidOption => e
+          #This is just a wrapper, let the actual commands handle bad options later
+          return true
+        rescue OptionParser::MissingArgument => e
+          @out.puts "Warning, #{e.message}"
+          exit(1)
+        end
+      end
+
+      def image
+        parser = Aeolus::CLI::ConfigParser.new(@args)
+        parser.process
+      end
+    end
+  end
+end
diff --git a/lib/aeolus_cli/command/config_parser.rb b/lib/aeolus_cli/command/config_parser.rb
index d0261e5..59de189 100644
--- a/lib/aeolus_cli/command/config_parser.rb
+++ b/lib/aeolus_cli/command/config_parser.rb
@@ -35,7 +35,7 @@ module Aeolus
         # File.expand_path("~")
         if COMMANDS.include?(@command)
           parse(@command)
-          self.send(@command.to_sym)
+          self.send(@command.to_sym) unless @args.include?('-h')
         else
           @args << "-h"
           puts "Valid command required: \n\n"
@@ -48,7 +48,7 @@ module Aeolus
         subcommand = subcommand.to_sym if subcommand
 
         @optparse ||= OptionParser.new do|opts|
-          opts.banner = "Usage: aeolus-cli [#{COMMANDS.join('|')}] [general options] [command options]"
+          opts.banner = "Usage: aeolus-cli image [#{COMMANDS.join('|')}] [general options] [command options]"
 
           opts.separator ""
           opts.separator "General options:"
@@ -218,7 +218,7 @@ module Aeolus
         end
 
         begin
-          @optparse.parse!(@args)
+          @optparse.parse(@args)
         rescue OptionParser::InvalidOption
           puts "Warning: Invalid option"
           exit(1)
diff --git a/spec/command/cli_parser.rb b/spec/command/cli_parser.rb
new file mode 100644
index 0000000..7efbc06
--- /dev/null
+++ b/spec/command/cli_parser.rb
@@ -0,0 +1,50 @@
+#   Copyright 2011 Red Hat, Inc.
+#
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+
+require 'spec_helper'
+
+module Aeolus
+  module CLI
+    describe CLIParser do
+      it "should parse the specified command" do
+          ConfigParser.any_instance.should_receive(:process).with(any_args()).and_return(true)
+          parser = CLIParser.new(%w(image list --images))
+          parser.process
+          parser.command.should == 'image'
+      end
+
+      context "output help" do
+        before(:each) do
+          @out = double("out")
+          @out.should_receive(:puts).with(instance_of(OptionParser)).once
+        end
+
+        it "should output help if no params passed" do
+          parser = CLIParser.new([], @out)
+          parser.process
+        end
+
+        it "should output help if -h passed" do
+          parser = CLIParser.new(%w(-h), @out)
+          parser.process
+        end
+
+        it "should output help if --help passed" do
+          parser = CLIParser.new(%w(--help), @out)
+          parser.process
+        end
+      end
+    end
+  end
+end
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index 1c20c7a..cc34318 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -15,24 +15,8 @@
 $: << File.expand_path(File.join(File.dirname(__FILE__), "../lib/aeolus_cli/command/"))
 $: << File.expand_path(File.join(File.dirname(__FILE__), "../lib/aeolus_cli/model/"))
 
-require 'rubygems'
-require 'base'
-require 'image'
-require 'build'
-require 'target_image'
-require 'provider_image'
-require 'provider'
-require 'provider_type'
-require 'provider_account'
-require 'config_parser'
+require 'aeolus_cli'
 require 'stringio'
-require 'base_command'
-require 'list_command'
-require 'build_command'
-require 'push_command'
-require 'import_command'
-require 'delete_command'
-require 'status_command'
 
 require 'vcr_setup'
 
-- 
1.7.7.4




More information about the aeolus-devel mailing list