class ArgsHelper
@author sleepless-p03t
Attributes
Public Class Methods
Initialize the helper @param args [Array] Argument array to process
# File lib/argshelper.rb, line 47 def initialize(args) @args_a = args @args = nil @skeys = [] @lkeys = [] @kvals = [] @kdescriptions = [] @static = {} @no_vals = [] @flag_pairs = BiHash.new end
Public Instance Methods
Add argument keys @param skey [Array, String] Short keys or short key @param lkey [Array, String] Long keys or long key @param kval [Array, String] Value description(s) or possible value(s) @param kdescription [Array, String] Key description(s)
# File lib/argshelper.rb, line 81 def add_keys(skey = nil, lkey = nil, kval = nil, kdescription = nil) arrays = [ skey.is_a?(Array) || skey == nil, lkey.is_a?(Array) || lkey == nil, kval.is_a?(Array) || kval == nil, kdescription.is_a?(Array) || kdescription == nil ] strings = [ skey.is_a?(String) || skey == nil, lkey.is_a?(String) || lkey == nil, kval.is_a?(String) || kval == nil, kdescription.is_a?(String) || kdescription == nil ] if arrays.include?(true) && arrays.include?(false) puts "Mismatched types: Expected either Arrays or Strings" exit end if arrays.include?(true) skey = [] if skey == nil lkey = [] if lkey == nil kval = [] if kval == nil kdescription = [] if kdescription == nil if skey != [] skey.each_with_index do |sk, i| if lkey != [] @flag_pairs.insert(sk, lkey[i]) else @flag_pairs.insert(sk, nil) end end end if lkey != [] && skey == [] lkey.each do |lk| @flag_pairs.insert(lk, nil) end end @skeys = skey @lkeys = lkey @kvals = kval @kdescriptions = kdescription return end if strings.include?(true) skey = '' if skey == nil lkey = '' if lkey == nil kval = '' if kval == nil kdescription = '' if kdescription == nil @skeys.push(skey) @lkeys.push(lkey) @kvals.push(kval) @kdescriptions.push(kdescription) if skey != '' @flag_pairs.insert(skey, lkey) end if lkey != '' && skey == '' @flag_pairs.insert(lkey, skey) end return end end
Define specific options available for a certain flag @param sflag [String] Short flag @param lflag [String] Long flag @param opts [Array] Flag options
# File lib/argshelper.rb, line 66 def add_static_flag_opts(sflag = nil, lflag = nil, opts = []) if sflag != nil @static[sflag] = opts end if lflag != nil @static[lflag] = opts end end
Returns the value of a given flag @param flag [String] Short or long flag @return [String, nil]
# File lib/argshelper.rb, line 212 def get_value(flag) fp = @flag_pairs.get_value(flag) if !@no_vals.include?(flag) if @args.has_key?(flag) return @args[flag] elsif @args.has_key?(fp) && fp != nil return @args[fp] else return nil end else return nil end end
Returns whether a flag has been found @param flag [String] Short or long flag @return [Boolean] If argument passed from command line
# File lib/argshelper.rb, line 204 def has_arg?(flag) fp = @flag_pairs.get_value(flag) return fp != nil && (@args_a.include?(flag) || @args_a.include?(fp)) end
Main processing of argument flags Handles errors in flags and flag values
# File lib/argshelper.rb, line 167 def parse_args @args = @args_a.each_slice(2).to_a.inject({}) { |h, k| h[k[0]] = k[1]; h } keys = @skeys + @lkeys @args.each do |k, v| if !keys.include?(k) puts "Unknown option `#{k}'" exit end if keys.include?(v) puts "Missing values for `#{k}' and `#{v}'" exit end if v != nil if v.start_with?('-') puts "Warning: Value of `#{k}' appears to be a flag" end if @static.has_key?(k) if !@static[k].include?(v) puts "Unknown option `#{v}' for `#{k}'" exit end end end end if remove_keys(@no_vals).has_blank? puts "Missing argument(s)" exit end end
Flag doesn't have a corresponding value @param sflag [String] Short flag @param lflag [String] Long flag
# File lib/argshelper.rb, line 143 def set_no_value(sflag = nil, lflag = nil) if sflag == nil && lflag == nil return end if sflag != nil if @args_a.include?(sflag) index = @args_a.find_index(sflag) @args_a = @args_a.insert(index + 1, nil) @no_vals.push(sflag) end end if lflag != nil if @args_a.include?(lflag) index = @args_a.find_index(lflag) @args_a = @args_a.insert(index + 1, nil) @no_vals.push(lflag) end end end
Display a help table
# File lib/argshelper.rb, line 228 def show_default_table show_table("Options", 2, @skeys, @lkeys, @kvals, @kdescriptions) end
Display contents in a table @param title [String] Table title @param pad [Integer] Minimum space between left and right sides of column @param cols [Array] Array(s) of table column data
# File lib/argshelper.rb, line 236 def show_table(title, pad, *cols) mlcols = [] cols = cols.map { |x| x == [] ? nil : x } cols.compact! cols.each do |c| if c.is_a? Array mlcols.push(c.map(&:to_s).max_by(&:length).length) elsif c.is_a? String mlcols.push(c.length) elsif c.is_a? Numeric mlcols.push(c.to_s.length) end end clens = [] mlcols.each { |m| clens.push((pad * 2) + m) } rows = cols.transpose sum = clens.inject(0){ |s, x| s + x } sum += cols.length - 1 tlen = title.length tpadl = (sum - tlen) / 2 tpadr = sum - (tlen + tpadl) print '+' print '-' * sum puts '+' print '|' print ' ' * tpadl print title print ' ' * tpadr puts '|' clens.each do |l| print '+' print '-' * l end puts '+' rows.each do |row| row.each_with_index do |col, i| len = clens[i] - col.length - pad print '|' print ' ' * pad print col print ' ' * len end puts '|' end clens.each do |l| print '+' print '-' * l end puts '+' end
Private Instance Methods
# File lib/argshelper.rb, line 294 def remove_keys(keys) args = @args keys.each { |k| args.delete(k) } return args end