lib/core/util/cli.rb in nucleon-0.2.2 vs lib/core/util/cli.rb in nucleon-0.2.3
- old
+ new
@@ -1,64 +1,64 @@
module Nucleon
module Util
module CLI
-
+
#-----------------------------------------------------------------------------
# Utilities
-
+
def self.message(name, default = nil)
if default.nil?
default = :none
end
- return I18n.t(name.to_s, :default_value => default.to_s)
+ return I18n.t(name.to_s, :default_value => Console.purple(default.to_s))
end
-
+
#---
-
+
def self.encode(data)
Base64.urlsafe_encode64(Util::Data.to_json(data, false))
end
-
+
def self.decode(encoded_string)
- Util::Data.symbol_map(Util::Data.parse_json(Base64.urlsafe_decode64(encoded_string)))
+ Util::Data.symbol_map(Util::Data.parse_json(Base64.urlsafe_decode64(encoded_string)))
end
-
+
#-------------------------------------------------------------------------
# Parser
-
+
class Parser
-
+
attr_accessor :parser, :options, :arguments, :extra, :processed, :strict
-
+
#---
-
+
include Mixin::Colors
-
+
#---
-
+
def initialize(args, banner = '', help = '', split_help = false)
@parser = OptionParser.new
-
+
self.options = {}
self.arguments = {}
self.extra = {}
self.processed = false
- self.strict = true
-
+ self.strict = true
+
@arg_settings = []
-
+
self.banner = banner
self.help = help
-
+
yield(self) if block_given?
-
+
parse_command(args, split_help)
end
-
+
#---
-
+
def self.split(args, banner, separator = '')
main_args = nil
sub_command = nil
sub_args = []
@@ -71,68 +71,68 @@
end
end
main_args = args.dup if main_args.nil?
results = [ Parser.new(main_args, banner, separator, true) ]
-
+
if sub_command
results << [ sub_command, sub_args ]
end
-
+
return results.flatten
end
-
+
#---
-
+
def banner=banner
- parser.banner = banner
+ parser.banner = banner
end
-
+
#---
-
+
def help
return parser.help
end
-
+
def help=help
if help.is_a?(Array)
help.each do |line|
- parser.separator line
- end
+ parser.separator line
+ end
else
parser.separator help
end
end
-
+
#---
-
+
def version
# Override in executable script
end
-
+
#---
-
+
def parse_command(args, split_help = false)
args = args.dup
error = false
-
+
self.processed = false
-
- option_bool(:version, false,
- '--version',
+
+ option_bool(:version, false,
+ '--version',
'nucleon.core.util.cli.options.version'
)
- option_bool(:color, true,
- '--[no]-color',
+ option_bool(:color, true,
+ '--[no]-color',
'nucleon.core.util.cli.options.color'
)
- option_str(:log_level, nil,
- '--log_level STR',
+ option_str(:log_level, nil,
+ '--log_level STR',
'nucleon.core.util.cli.options.log_level'
)
- option_str(:encoded_params, false,
- '--encoded STR',
+ option_str(:encoded_params, false,
+ '--encoded STR',
'nucleon.core.util.cli.options.encoded'
)
if split_help
parser.on_tail('-h', CLI.message('nucleon.core.util.cli.options.short_help')) do
options[:help] = true
@@ -142,47 +142,47 @@
options[:extended_help] = true
end
else
parser.on_tail('-h', '--help', CLI.message('nucleon.core.util.cli.options.short_help')) do
options[:help] = true
- end
+ end
end
-
+
if strict
parser.parse!(args)
extra_args = {}
else
args, extra_args = parse_known_args(parser, args)
end
-
+
# Now we can act on options given
options[:color] = Util::Console.use_colors
-
+
if options[:version]
puts version
exit 0
end
-
+
return if options[:help]
-
+
parse_encoded
-
+
Nucleon.log_level = options[:log_level] if options[:log_level]
-
+
self.extra = normalize_extra_options(extra_args) unless extra_args.empty?
-
+
remaining_args = args.dup
arg_messages = []
-
+
if arguments.empty?
@arg_settings.each_with_index do |settings, index|
if index >= args.length
value = nil
else
value = Util::Data.value(args[index])
end
-
+
if !value.nil? && settings.has_key?(:allowed)
allowed = settings[:allowed]
case allowed
when Class
if (allowed == Array)
@@ -194,84 +194,84 @@
error = true
end
when Array
unless allowed.include(value)
arg_messages << CLI.message(settings[:message])
- error = true
+ error = true
end
end
end
-
+
if value.nil?
if settings.has_key?(:default)
value = settings[:default]
else
error = true
end
end
-
+
if !value.nil? && settings.has_key?(:block)
value = settings[:block].call(value)
error = true if value.nil?
end
-
+
break if error
-
+
remaining_args.shift unless remaining_args.empty?
self.arguments[settings[:name]] = value
- end
+ end
end
-
+
if error
if ! arg_messages.empty?
parser.warn(CLI.message('nucleon.core.util.cli.parse.error') + "\n\n" + arg_messages.join("\n") + "\n\n" + parser.help)
else
- parser.warn(CLI.message('nucleon.core.util.cli.parse.error') + "\n\n" + parser.help)
+ parser.warn(CLI.message('nucleon.core.util.cli.parse.error') + "\n\n" + parser.help)
end
else
self.processed = true
end
-
+
rescue OptionParser::InvalidOption => e
parser.warn(e.message + "\n\n" + parser.help)
end
-
+
#---
-
+
def parse_encoded
if options[:encoded_params]
encoded_properties = CLI.decode(options[:encoded_params])
-
+
@arg_settings.each do |settings|
if encoded_properties.has_key?(settings[:name].to_sym)
self.arguments[settings[:name]] = encoded_properties.delete(settings[:name].to_sym)
end
end
-
+
encoded_properties.each do |name, value|
self.options[name] = value
-
+
if name == :color
Util::Console.use_colors = value
end
end
end
options.delete(:encoded_params)
end
-
+
#---
-
+
def parse_known_args(parser, args)
extra_args = []
-
+
parse_args = lambda do |arg_list|
begin
original_list = arg_list.clone
-
+
parser.parse! arg_list
args = arg_list
-
+
rescue OptionParser::InvalidOption => e
extra_args += e.args
while arg_list[0] && arg_list[0][0] != '-'
extra_args << arg_list.shift
end
@@ -279,182 +279,182 @@
end
end
parse_args.call args
[ args, extra_args ]
end
-
+
#---
-
+
def normalize_extra_options(arg_list)
- options = {}
+ options = {}
last_option = nil
-
+
Util::Data.array(arg_list).each do |arg|
components = arg.split('=')
- value = nil
-
+ value = nil
+
if components.size > 1
arg = components[0]
- value = components[1]
+ value = components[1]
end
-
+
if arg[0] == '-'
last_option = arg.sub(/^\-+/, '').to_sym
- options[last_option] = Util::Data.value(value) if value
+ options[last_option] = Util::Data.value(value) if value
else
if last_option
if options[last_option]
options[last_option] = [ options[last_option] ] unless options[last_option].is_a?(Array)
options[last_option] << Util::Data.value(arg)
else
- options[last_option] = Util::Data.value(arg)
- end
+ options[last_option] = Util::Data.value(arg)
+ end
else
parser.warn(CLI.message('nucleon.core.util.cli.parse.error') + "\n\n" + parser.help)
- break
+ break
end
- end
- end
+ end
+ end
options
end
protected :normalize_extra_options
-
+
#---
-
+
def option(name, default, option_str, allowed_values, message_id, config = {})
config = Config.ensure(config)
name = name.to_sym
options[name] = config.get(name, default)
-
+
message_name = name.to_s + '_message'
message = CLI.message(message_id, options[name])
-
+
option_str = Util::Data.array(option_str)
-
+
if allowed_values
parser.on(*option_str, allowed_values, config.get(message_name.to_sym, message)) do |value|
value = yield(value) if block_given?
options[name] = value unless value.nil?
end
else
parser.on(*option_str, config.get(message_name.to_sym, message)) do |value|
value = yield(value) if block_given?
options[name] = value unless value.nil?
- end
+ end
end
end
-
+
#---
-
+
def arg(name, default, allowed_values, message_id, config = {}, &block)
config = Config.ensure(config)
name = name.to_sym
-
+
message_name = name.to_s + '_message'
message = CLI.message(message_id, arguments[name])
-
- settings = {
+
+ settings = {
:name => name,
:default => config.get(name, default),
- :message => config.get(message_name.to_sym, message)
+ :message => config.get(message_name.to_sym, message)
}
settings[:allowed] = allowed_values if allowed_values
settings[:block] = block if block
-
+
settings.delete(:default) if settings[:default].nil?
-
- @arg_settings << settings
+
+ @arg_settings << settings
end
-
+
#---
-
+
def option_bool(name, default, option_str, message_id, config = {})
option(name, default, option_str, nil, message_id, config) do |value|
value = Util::Data.value(value)
if value == true || value == false
block_given? ? yield(value) : value
else
nil
- end
- end
+ end
+ end
end
-
+
#---
-
+
def arg_bool(name, default, message_id, config = {})
arg(name, default, nil, message_id, config) do |value|
value = Util::Data.value(value)
if value == true || value == false
block_given? ? yield(value) : value
else
nil
- end
- end
+ end
+ end
end
-
+
#---
-
+
def option_int(name, default, option_str, message_id, config = {})
option(name, default, option_str, Integer, message_id, config) do |value|
- block_given? ? yield(value) : value
- end
+ block_given? ? yield(value) : value
+ end
end
-
+
#---
-
+
def arg_int(name, default, message_id, config = {})
arg(name, default, Integer, message_id, config) do |value|
- block_given? ? yield(value) : value
- end
+ block_given? ? yield(value) : value
+ end
end
-
+
#---
-
+
def option_float(name, default, option_str, message_id, config = {})
option(name, default, option_str, Float, message_id, config) do |value|
- block_given? ? yield(value) : value
- end
+ block_given? ? yield(value) : value
+ end
end
-
+
#---
-
+
def arg_float(name, default, message_id, config = {})
arg(name, default, Float, message_id, config) do |value|
- block_given? ? yield(value) : value
- end
+ block_given? ? yield(value) : value
+ end
end
-
+
#---
-
+
def option_str(name, default, option_str, message_id, config = {})
option(name, default, option_str, nil, message_id, config) do |value|
- block_given? ? yield(value) : value
- end
+ block_given? ? yield(value) : value
+ end
end
-
+
#---
-
+
def arg_str(name, default, message_id, config = {})
arg(name, default, nil, message_id, config) do |value|
- block_given? ? yield(value) : value
- end
+ block_given? ? yield(value) : value
+ end
end
-
+
#---
-
+
def option_array(name, default, option_str, message_id, config = {})
option(name, default, option_str, Array, message_id, config) do |value|
- block_given? ? yield(value) : value
- end
+ block_given? ? yield(value) : value
+ end
end
-
+
#---
-
+
def arg_array(name, default, message_id, config = {})
arg(name, default, Array, message_id, config) do |value|
- block_given? ? yield(value) : value
- end
+ block_given? ? yield(value) : value
+ end
end
- end
+ end
end
end
end