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