[PATCH 1/3] BZ# 768507: aeolus-cli needs syntax to be more flexible
Jason Guiditta
jguiditt at redhat.com
Tue Dec 20 17:30:43 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 2be3e61..438bb70 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:"
@@ -221,7 +221,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 2c3ccd7..d198732 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