class Luban::CLI::Argument

Constants

BoolValues

Attributes

description[R]
display_name[R]
name[R]
value[RW]

Public Class Methods

new(name, desc, **config, &blk) click to toggle source
# File lib/luban/cli/base/argument.rb, line 12
def initialize(name, desc, **config, &blk)
  @name = name
  @display_name = name.to_s.upcase
  @description = desc.to_s
  @handler = block_given? ? blk : ->(v) { v }
  @config = config
  init_config
  verify_config
  reset
end

Public Instance Methods

[](key) click to toggle source
# File lib/luban/cli/base/argument.rb, line 38
def [](key); @config[key]; end
assured?(value = @value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 69
def assured?(value = @value)
  @config[:assure].nil? ? true : !!@config[:assure].call(value)
end
default_imperative() click to toggle source
# File lib/luban/cli/base/argument.rb, line 36
def default_imperative; true; end
default_type() click to toggle source
# File lib/luban/cli/base/argument.rb, line 35
def default_type; :string; end
has_default?() click to toggle source
# File lib/luban/cli/base/argument.rb, line 42
def has_default?; !@config[:default].nil?; end
kind() click to toggle source
# File lib/luban/cli/base/argument.rb, line 23
def kind
  @kind ||= self.class.name.split('::').last.downcase
end
match?(value = @value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 61
def match?(value = @value)
  @config[:match].nil? ? true : !!@config[:match].match(value)
end
missing?(value = @value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 57
def missing?(value = @value)
  required? and value.nil?
end
multiple?() click to toggle source
# File lib/luban/cli/base/argument.rb, line 43
def multiple?; @config[:multiple]; end
optional?() click to toggle source
# File lib/luban/cli/base/argument.rb, line 41
def optional?; !@config[:required]; end
required?() click to toggle source
# File lib/luban/cli/base/argument.rb, line 40
def required?; @config[:required]; end
reset() click to toggle source
# File lib/luban/cli/base/argument.rb, line 27
def reset
  @value = set_default_value
end
valid?(value = @value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 51
def valid?(value = @value)
  (multiple? ? value : [value]).all? do |v| 
    !missing?(v) and match?(v) and within?(v) and assured?(v)
  end
end
validate(value = @value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 45
def validate(value = @value)
  unless valid?(value)
    raise InvalidArgumentValue, "Invalid value of #{kind} #{display_name}: #{value.inspect}"
  end
end
value=(v) click to toggle source
# File lib/luban/cli/base/argument.rb, line 31
def value=(v)
  @value = process(v).tap { |v| validate(v) }
end
within?(value = @value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 65
def within?(value = @value)
  @config[:within].nil? ? true : @config[:within].include?(value)
end

Protected Instance Methods

bool?(value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 199
def bool?(value); value.is_a?(TrueClass) or value.is_a?(FalseClass); end
cast_bool(value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 190
def cast_bool(value); !!BoolValues[value.to_s.downcase]; end
cast_date(value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 187
def cast_date(value); Date.parse(value); end
cast_datetime(value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 188
def cast_datetime(value); DateTime.parse(value); end
cast_float(value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 184
def cast_float(value); Float(value); end
cast_integer(value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 183
def cast_integer(value); Integer(value); end
cast_method(type) click to toggle source
# File lib/luban/cli/base/argument.rb, line 180
def cast_method(type); "cast_#{type}"; end
cast_string(value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 182
def cast_string(value); String(value); end
cast_symbol(value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 185
def cast_symbol(value); value.to_sym; end
cast_time(value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 186
def cast_time(value); Time.parse(value); end
cast_type(value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 159
def cast_type(value)
  unless value.nil?
    if multiple?
      value.map! { |v| cast_value(v) }
    else
      value = cast_value(value)
    end
  end
  value
end
cast_value(value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 170
def cast_value(value)
  if send("#{@config[:type]}?", value)
    value
  else
    method(cast_method(@config[:type])).call(value)
  end
rescue StandardError => e
  raise TypeCastingFailed, "Type casting to #{@config[:type]} for #{kind} #{display_name} failed: #{e.class.name} - #{e.message}"
end
date?(value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 197
def date?(value); value.is_a?(Date); end
datetime?(value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 198
def datetime?(value); value.is_a?(DateTime); end
float?(value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 194
def float?(value); value.is_a?(Float); end
init_config() click to toggle source
# File lib/luban/cli/base/argument.rb, line 75
def init_config
  @config[:type] ||= default_type
  @config[:required] = default_imperative if @config[:required].nil?
  @config[:required] = !!@config[:required]
  @config[:multiple] = !!@config[:multiple]
end
integer?(value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 193
def integer?(value); value.is_a?(Integer); end
normalize_type(type) click to toggle source
# File lib/luban/cli/base/argument.rb, line 97
def normalize_type(type); type.to_s.downcase.to_sym; end
post_process(value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 157
def post_process(value); value; end
pre_process(value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 153
def pre_process(value)
  cast_type(set_default_value(value))
end
process(value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 149
def process(value)
  post_process(@handler.call(pre_process(value)))
end
set_default_value(value = nil) click to toggle source
# File lib/luban/cli/base/argument.rb, line 141
def set_default_value(value = nil)
  if !@config[:default].nil? and value.nil?
    @config[:default]
  else
    value
  end
end
string?(value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 192
def string?(value); value.is_a?(String); end
symbol?(value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 195
def symbol?(value); value.is_a?(Symbol); end
time?(value) click to toggle source
# File lib/luban/cli/base/argument.rb, line 196
def time?(value); value.is_a?(Time); end
verify_config() click to toggle source
# File lib/luban/cli/base/argument.rb, line 82
def verify_config
  verify_config_type if @config.has_key?(:type)
  verify_config_default_value if @config.has_key?(:default)
  verify_config_match if @config.has_key?(:match)
  verify_config_within if @config.has_key?(:within)
  verify_config_assurance if @config.has_key?(:assure)
end
verify_config_assurance() click to toggle source
# File lib/luban/cli/base/argument.rb, line 135
def verify_config_assurance
  unless @config[:assure].respond_to?(:call)
    raise ArgumentError, "Assurance of #{kind} #{display_name} must respond to #call."
  end
end
verify_config_default_value() click to toggle source
# File lib/luban/cli/base/argument.rb, line 99
def verify_config_default_value
  err_msg = nil
  type = @config[:type]
  default = @config[:default]
  unless type.nil?
    if multiple?
      unless default.is_a?(Array) and
             default.all? { |v| send("#{type}?", v) }
        err_msg = "must be an array of #{type} instances"
      end
    else
      unless send("#{type}?", default)
        err_msg = "must be an instance of #{type}"
      end
    end
  end
  unless err_msg.nil?
    raise ArgumentError, "Default value for #{kind} #{display_name} #{err_msg}"
  end
  unless valid?(default)
    raise ArgumentError, "Invalid default value for #{kind} #{display_name}: #{default.inspect}"
  end
end
verify_config_match() click to toggle source
# File lib/luban/cli/base/argument.rb, line 123
def verify_config_match
  unless @config[:match].respond_to?(:match)
    raise ArgumentError, "Matching pattern of #{kind} #{display_name} must respond to #match."
  end
end
verify_config_type() click to toggle source
# File lib/luban/cli/base/argument.rb, line 90
def verify_config_type
  @config[:type] = normalize_type(@config[:type])
  unless respond_to?(cast_method(@config[:type]), true)
    raise ArgumentError, "NOT castable type for #{kind} #{display_name}: #{@config[:type]}"
  end
end
verify_config_within() click to toggle source
# File lib/luban/cli/base/argument.rb, line 129
def verify_config_within
  unless @config[:within].respond_to?(:include?)
    raise ArgumentError, "Possible values of #{kind} #{display_name} must respond to #include?."
  end
end