class Coaster::CmdOptions
Attributes
args[R]
cmd[R]
options[R]
remain_args[R]
str[R]
sub_cmd[R]
Public Class Methods
new(cmd, *args, **options)
click to toggle source
# File lib/coaster/cmd_options.rb, line 74 def initialize(cmd, *args, **options) arg_options = args.extract_options! options = options.merge(arg_options) @cmd = cmd @cmd, @sub_cmd = @cmd if @cmd.is_a?(Array) remain_ix = args.index{ |k| k == '--'} if remain_ix @remain_args = args[remain_ix+1..-1] @args = args[0...remain_ix] else @args = args end @args.delete_if do |arg| if arg.is_a?(self.class) options = arg.to_h.merge(options) true else false end end options['--'] ||= [] options['--'] += @remain_args if @remain_args @options = options @args << self.class.options_to_s(options).strip @str = @args.join(' ') end
option_v_to_s(option_v)
click to toggle source
# File lib/coaster/cmd_options.rb, line 14 def option_v_to_s(option_v) case option_v when Hash then option_v.map{|vk,vv| Set[vk, vv]}.to_set when Array then option_v.map{|v| option_v_to_s(v)}.join(',') when Set then option_v.map{|v| option_v_to_s(v)}.join('=') else option_v = (option_v || '').to_s option_v = option_v.gsub(/"/, '\"') option_v = "\"#{option_v}\"" if option_v.include?(' ') option_v end end
options_h_to_s(options)
click to toggle source
# File lib/coaster/cmd_options.rb, line 27 def options_h_to_s(options) opts = [] # multiple options can be passed by set options.map do |k, v| if v.is_a?(Set) v.each {|set_v| opts << [k, set_v]} else opts << [k, v] end end targets = '' parsed = opts.map do |k, v| if k.start_with?(/--\w/) v = option_v_to_s(v) if v.is_a?(Set) v.map {|vv| "#{k}=#{option_v_to_s(vv)}" }.join(' ') else "#{k}#{v.length > 0 ? "=#{v}" : ''}" # ex, --config-env=<name>=<envvar> end elsif k.start_with?(/-\w/) v = option_v_to_s(v) if v.is_a?(Set) v.map {|vv| "#{k} #{option_v_to_s(vv)}"}.join(' ') else "#{k} #{v}" # ex, -c <name>=<value> end elsif k == '--' if v.present? v = Array.wrap(v) v = v.map{|e| option_v_to_s(e)}.join(' ') targets = "-- #{v}" # ex, -- <args> '' end else raise "Unknown option: #{k}" end end parsed << targets parsed.join(' ') end
options_to_s(options)
click to toggle source
# File lib/coaster/cmd_options.rb, line 6 def options_to_s(options) case options when Hash then options_h_to_s(options) when Array, Set then options.map{|o| options_to_s(o)}.join(' ') else options end end
Public Instance Methods
merge(*args, **options)
click to toggle source
# File lib/coaster/cmd_options.rb, line 119 def merge(*args, **options) if args.first.is_a?(CmdOptions) other = args.shift else other = self.class.new([@cmd, @sub_cmd], *args, **options) end self.class.new(to_h.merge(other.to_h)) end
parser()
click to toggle source
# File lib/coaster/cmd_options.rb, line 105 def parser parser_proc = parser_proc(@cmd, @sub_cmd) instance_exec(&parser_proc) end
parser_proc(*args)
click to toggle source
# File lib/coaster/cmd_options.rb, line 101 def parser_proc(*args) raise 'Not implemented' end
to_h()
click to toggle source
# File lib/coaster/cmd_options.rb, line 110 def to_h return @hash if defined?(@hash) @hash = {} remain_args = parser.parse!(@str.split(' ')) @hash['--'] = remain_args if remain_args.any? @hash end
to_s()
click to toggle source
# File lib/coaster/cmd_options.rb, line 128 def to_s return self.class.options_h_to_s(@hash) if defined?(@hash) @str end